一般来说,过程如下:
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:
{
......
}
......
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)