关于COM口通讯的问题

sodawater 2000-06-16 07:45:00
这个问题比较简单,是这样的,我怎么样才能判断我上次发的数据发完没
我编的程序段是这样的
WHILE(TRUE)
COMFILE.WRITE((HANDLE)COMFILE.m_hFile,&lpbuf);
这是一个循环发送,但在示波器上测出的数据不对
肯定是没有判断数据发完没有的原故与上次的数据重叠所至
不用直接对端口进行操作,用什么函数,怎样得到数据发完没有。
我发的数据是0x55,长度为1
...全文
285 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sodawater 2000-06-24
  • 打赏
  • 举报
回复
现在这个问题已经解决了,谢谢各位
sodawater 2000-06-18
  • 打赏
  • 举报
回复
我是直接用CFile类打开的串口,不能用WriteFile,只能用Write怎么办?不知道有没有影响,等待函数?
sodawater 2000-06-18
  • 打赏
  • 举报
回复
我去试一下,我的串口通讯的问题是这样的,在低波特率下,输出正常
在高波特率下,28。8K下输出不正常,似乎夹杂着什么东西在里面,如发AA
AA可以被看到,但还有其它的东西混在一起发了在AA之间,不知道是不是没有做以下的
工作的原因
windoze 2000-06-18
  • 打赏
  • 举报
回复
上面的例子写错了:),应该是
DCB dcb;
memset(&dcb, 0, sizeof(DCB));
CString str="baud=28800 parity=N data=8 stop=1";
BuildCommDCB(str, &dcb);
SetCommState(SomeFile.m_hFile, &dcb);
windoze 2000-06-18
  • 打赏
  • 举报
回复
还有一点,串口实际的通信速率最大为9600bps,如果高于这个值,就会进行压缩,这时你需要用SetCommState设置串口的属性,比如:
DCB dcb;
memset(&dcb, 0, sizeof(DCB));
CString str="baud=28800 parity=N data=8 stop=1";
SetCommState(SomeFile.m_hFile, &dcb);
这样将串口的通信速率设为28800bps,无校验位,8位数据位,一位停止位。
windoze 2000-06-18
  • 打赏
  • 举报
回复
CFile类中有一个m_hFile成员变量,使用WriteFile(SomeFile.m_hFile, ...)就行了。
sodawater 2000-06-17
  • 打赏
  • 举报
回复
应该等待什么事件呢?
自定义的事件?怎样才能表达是写完了呢
请给一个实例好吗?后一种就是用异步文件读写的方式那种,
sjxf 2000-06-17
  • 打赏
  • 举报
回复
使用ReadFileEx
windoze 2000-06-17
  • 打赏
  • 举报
回复
异步文件读写的例子:

//创建事件对象
HANDLE hEvent=CreateEvent(NULL, FALSE, FALSE, NULL);

// ...

HANDLE hFile=CreateFile("COM1",...); //这我就不多写了

OVERLAPPED ol;
ol.hEvent=hEvent;
WriteFile(hFile, lpBuffer, dwBufferLen, &dwWrittenBytes, &ol);
// 写文件的操作立即返回,但是并没有完成

// ...

// 等待写操作完成
DWORD dwRet=WaitForSingleObject(hEvent, INFINITE);
// 当写操作完成后,前面的hEvent会被置位,Wait函数会阻塞直到hEvent置位为止。
// INFINITE表示无限等待,可以换成一个毫秒数,表示等待指定时间,若超时,dwRet的值为WAIT_TIMEOUT,正常情况下返回WAIT_OBJECT_0
windoze 2000-06-16
  • 打赏
  • 举报
回复
Flush是CFile的一个成员函数,其作用就是将缓冲区内的所有数据写入文件,对于串口来说就是写入串口。
这个函数会阻塞到数据全部写完或者出错为止,这样你就不用查询数据是否发送完了。对应的Windows API函数是FlushFileBuffers。

另外,你还可以采用异步文件读写的方式,也就是说当你写串口的时候,WriteFile函数会立即返回,到写入完成时,系统会使用一个你事先指定的Event对象通知你的程序,你的程序可是使用WaitForSingleObject等函数等待直到通知为止。

详情参见MSDN中关于CreateFile、ReadFile、ReadFileEx、WriteFile和WriteFileEx的说明。
sodawater 2000-06-16
  • 打赏
  • 举报
回复
什么是FLUSH,原理是什么?
我想用查询数据是否发完,然后继续发的这种方式,你先说说
什么是FLUSH吧
windoze 2000-06-16
  • 打赏
  • 举报
回复
使用Flush强制处理缓冲区中的数据。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧