51单片机通过串口实现数据的发送与接收程序

51单片机通过串口实现数据的发送与接收程序,第1张

串口收发,要有通信协议。也就是什么时候开始接收,接收到指令后,转发什么数据。这个要知道,才可以写。而且使用不同的51单片机,其内部寄存器配置是不同的。

一般来说,过程如下:

1,配置串口参数、波特率等,开启串口中断;

void Init_UART()

{

}

2,中断函数里写中断响应函数,根据接收的指令或者数据,执行相应的动作;

程序一般为:

void UART_ISR() interrupt x using y

{

串口中断处理函数

}

x - 单片机的C51中断号

y - 指定使用的当前工作寄存器组号(0-3 PSW中的RS0,RS1组合)

3,主程序

int main(void)

{

Init_UART()

while(1)

{

//数据发送函数

}

}

解决方法:

解决的思路是将写串口事件(m_hWriteEvent)的优先级高于接收事件(m_ov.hEvent),如下:

BOOL CSerialPort::InitPort(......){

......

m_hEventArray[0] = m_hShutdownEvent// highest priority

m_hEventArray[1] = m_hWriteEvent

m_hEventArray[2] = m_ov.hEvent

......

}

UINT CSerialPort::CommThread(LPVOID pParam){

......

switch (Event)

{

case 0:

{

......

}

case 2:

{

memset(&comstat, 0, sizeof(COMSTAT))

GetCommMask(port->m_hComm, &CommEvent)

if (CommEvent &EV_RXCHAR)//接收到字符,并置于输入缓冲区中

// Receive character event from port.

ReceiveChar(port, comstat)

......

break

}

case 1: /// write event发送数据

{

// Write character event from port

WriteChar(port)

break

}

default:

{

......

}

......

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11002307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存