我请问问大家 我用vc的mfc编程,直接用VC++访问串口,有一个进程是一直查询串口有没有收到数据 ,如果有数据的话再按照和设备的通讯协议交换数据,想问如何查询串口有没有收到数据,只检测而不读数据,本人刚接触vc,完全新手,请各位指点~
解决方案 »
- missing ';' before identifier 'LRESULT'
- ADO 如何取出smallint数据类型的数据
- 这样的消息是什么样的消息
- 请教一个简单的问题:我在SDI程序中,切分成了两个VIEW,左边是TreeView,右边是个ListView,想问问用鼠标点击左边的树型的节点来进行切
- 如何在STYLE为CHILD的对话框中添加MENU???
- 电脑上的串口那个哪个是com1?
- 多播(★★★)
- 请高手进来看看,一个不是多线程应用占用CPU达到98%(在线等待)
- 如何得到一个基于CWinThread线程的HWND?
- 请教大侠:如何编写WAVECOM产品实现短消息的收发。
- bluetooth的setsockopt问题
- 关于属性表单CPropertySheet的标题栏图标。
或许有用
DWORD fCtsHold : 1;
DWORD fDsrHold : 1;
DWORD fRlsdHold : 1;
DWORD fXoffHold : 1;
DWORD fXoffSent : 1;
DWORD fEof : 1;
DWORD fTxim : 1;
DWORD fReserved : 25;
DWORD cbInQue;
DWORD cbOutQue;
} COMSTAT, *LPCOMSTAT;#define EV_RXCHAR 0x0001 // Any Character received
这里的DWORD cbInQue;或者EV_RXCHAR
如果是双击该控件产生的写以下代码
void CJIANView::OnOnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_MSComm.GetCommEvent()==2){//等于2表示读缓冲区有数据
variant_inp=m_MSComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
}
static DWORD WINAPI com_thread(LPVOID para)
{
_thread_com *pcom = (_thread_com *)para;
if(!SetCommMask(pcom->_com_handle, EV_RXCHAR | EV_ERR))
return 0; COMSTAT stat;
DWORD error; for(DWORD length, mask = 0; pcom->_run_flag && pcom->is_open(); mask = 0)
{
if(!WaitCommEvent(pcom->_com_handle, &mask, &pcom->_wait_o))
{
if(GetLastError() == ERROR_IO_PENDING)
{
GetOverlappedResult(pcom->_com_handle, &pcom->_wait_o, &length, true);
}
} if(mask & EV_ERR) // == EV_ERR
ClearCommError(pcom->_com_handle, &error, &stat); if(mask & EV_RXCHAR) // == EV_RXCHAR
{
ClearCommError(pcom->_com_handle, &error, &stat);
if(stat.cbInQue > pcom->_notify_num)
pcom->on_receive();
}
} return 0;
}
//异步读
int read(char *buf, int buf_len)
{
if(!is_open())
return 0; buf[0] = '\0'; COMSTAT stat;
DWORD error; if(ClearCommError(_com_handle, &error, &stat) && error > 0) //清除错误
{
PurgeComm(_com_handle, PURGE_RXABORT | PURGE_RXCLEAR); /*清除输入缓冲区*/
return 0;
} if(!stat.cbInQue)// 缓冲区无数据
return 0; unsigned long r_len = 0; buf_len = min((int)(buf_len - 1), (int)stat.cbInQue); if(!ReadFile(_com_handle, buf, buf_len, &r_len, &_ro)) //2000 下 ReadFile 始终返回 True
{
if(GetLastError() == ERROR_IO_PENDING) // 结束异步I/O
{
if(!GetOverlappedResult(_com_handle, &_ro, &r_len, false))
{
if(GetLastError() != ERROR_IO_INCOMPLETE)//其他错误
r_len = 0;
}
}
else
r_len = 0;
} buf[r_len] = '\0';
return r_len;
}