串口通讯中使用CSerialPort类发送数据时数据丢失问题

liuka 2008-06-30 01:22:12
我使用这个类发送数据
m_ser.WriteToPort(chSend);
m_ser.WriteToPort(chSend1);
m_ser.WriteToPort(chSend2);
如果是直接这样发送
发现中间的chSend1数据没有发出去

而在每个发送后加一个
AfxMessageBox("");断一哈
就可以成功发送了?
请问是什么原因??
...全文
457 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dou303 2010-07-11
  • 打赏
  • 举报
回复
都没有真正解决问题!
gilbertjuly 2009-08-24
  • 打赏
  • 举报
回复
这里同步异步的概念是指:
串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。
http://www.vckbase.com/document/viewdoc/?id=1734#%E8%AF%BB%E5%86%99%E4%B8%B2%E5%8F%A3
gilbertjuly 2009-08-24
  • 打赏
  • 举报
回复
由于采用异步发送, 在它的那个线程里面, 只发送一次.
就是说:
m_ser.WriteToPort(chSend);
这句话执行好之后并不是马上发送串口数据
要等进入它的线程之后再发送.
你可以跟踪下是什么时候进入它的线程的.
三句writetoport都会进入这个线程
但是只能执行一个,最后一个.
gilbertjuly 2009-08-24
  • 打赏
  • 举报
回复
我终于明白了,这个类没有办法同步发送数据,看它的cpp文件中的初始化:
m_hComm = CreateFile(szPort,// communication port string (COMX)
GENERIC_READ | GENERIC_WRITE, // read/write types
0, // comm devices must be opened with exclusive access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
FILE_FLAG_OVERLAPPED, // Async I/O
0); // template must be 0 for comm devices
FILE_FLAG_OVERLAPPED被设置为异步,并且不能改为同步,要同步的话用其他类吧,比如:
http://blog.chinaunix.net/u/32550/showart_365425.html
liuka 2008-07-14
  • 打赏
  • 举报
回复
谢谢各位
effective_person 2008-07-12
  • 打赏
  • 举报
回复
我写程序时也出现这种情况了,
可以采用Sleep(1000)
就可以了,可能一次发送不了这么多的数据吧!
zhoujiamurong 2008-07-04
  • 打赏
  • 举报
回复
楼上的办法有隐患,可能遗留上次的缓冲内容!

原来我一直用这类,很好用,这个问题我也遇到,后仔细研究发现它在写的时候是
void CSerialPort::WriteToPort(const char* string)
{
VERIFY(m_hComm != 0);

memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
strcpy(m_szWriteBuffer, string);

// set event for write//设置成信号态以便写
SetEvent(m_hWriteEvent);
}
所以你这样连续用,就会出问题。
后来我的解决方法是这样的:开一个Timer
在Timer中控制一次写,每次进来Timer的写就可以了。
你只要控制Timer就可以控制写的次数。
这样既不会缓冲区遗留上次写的内容,也不会写失败了。
一条晚起的虫 2008-06-30
  • 打赏
  • 举报
回复
m_ser.WriteToPort(chSend);
m_ser.WriteToPort(chSend1);
m_ser.WriteToPort(chSend2);
如果是直接这样发送
发现中间的chSend1数据没有发出去

//CSerialPort是异步串口操作,并且在每次WriteToPort()时,有清除发送缓冲区,要连续发送,只要把清除发送缓冲区的那个语句屏蔽就可以了。
//或者等待WriteFile真正操作成功,那样就和同步方式没有什么区别了。
zaodt 2008-06-30
  • 打赏
  • 举报
回复

没用过那个类,即使用人家写好的类,也应该搞懂原理。


推荐先看看下边这篇文章:


http://vckbase.com/document/viewdoc/?id=1114

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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