c语言中can口通信可以用waitcommevent函数吗,串口通讯WaitCommEvent 、GetLastError、ClearCommError、......

一、首先是利用WaitCommEvent 来等待串口事件的被触发,这些事件是指在该函数被调用前,我们自己设置好的能触发串口线程的有效事件。

主要包括3类事件:

1. 函数SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR )设置的数据接收中断

2.用户中断线程的操作。

3. 用户发送数据所产生的中断。

该函数相当于利用事件来同步,实际函数也是这么设计的。但没有有效中断触发,线程会一直在这里等待。

一旦被触发,程序才能继续往下执行。

二、函数WaitCommEvent执行完成后,他的返回值若为零,说明有错误,这时候用GetLastError来查询错误类型。

三、函数WaitCommEvent执行返回值若为1,则用ClearCommError来清除错误,并查询串口的状态,得到comstat的值。

四、检查ClearCommError所查询的串口状态comstat.cbInQue的值,若不大于0,说明错误。继续等待事件的触发

五、若omstat.cbInQue大于0,说明buffer里面有字符。在使用WaitForMultipleObjects函数确认事件,并执行对应的操作。

六、接收完缓冲区中的数据后,注意清空缓冲区,方便下一次接收

//WaitCommEvent函数为指定的通信资源监听一系列的Event,这些Event可以由 SetcommMask和 GetcommMask函数来设置和查询。

例子:

bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov);

if (!bResult)

{

// If WaitCommEvent() returns FALSE, process the last error to determin

switch (dwError = GetLastError())

{

case ERROR_IO_PENDING:

{

break;

}

case 87:

{

break;

}

default:

{

port->ProcessErrorMessage("WaitCommEvent()");

break;

}

}

}

else

{

bResult = ClearCommError(port->m_hComm, &dwError, &comstat);

if (comstat.cbInQue == 0)

continue;

}    // end if bResult

//m_hEventArray[0] = m_hShutdownEvent;    // highest priority

//m_hEventArray[1] = m_ov.hEvent;

//m_hEventArray[2] = m_hWriteEvent;

Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);

switch (Event)

{

case 0:

{

// Shutdown event.  This is event zero so it will be// the higest priority and be serviced first.

CloseHandle(port->m_hComm);

port->m_hComm=NULL;

port->m_bThreadAlive = FALSE;

// Kill this thread.  break is not needed, but makes me feel better.

AfxEndThread(100);

break;

}

case 1:    // read event

{

GetCommMask(port->m_hComm, &CommEvent);

if (CommEvent & EV_RXCHAR)

// Receive character event from port.

ReceiveChar(port, comstat);

if (CommEvent & EV_CTS)

::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_CTS_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);

if (CommEvent & EV_BREAK)

::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_BREAK_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);

if (CommEvent & EV_ERR)

::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_ERR_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);

if (CommEvent & EV_RING)

::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RING_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);

if (CommEvent & EV_RXFLAG)

::SendMessage(port->m_pOwner->m_hWnd, WM_COMM_RXFLAG_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);

break;

}

case 2: // write event

{

// Write character event from port

WriteChar(port);

break;

}

} // end switch

} // close forever loop

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值