整理CSerialPort 的理解。遇到的问题

来源:互联网 发布:网络作家年收入十万 编辑:程序博客网 时间:2024/04/29 19:02

CSerialPort 一个很好用的串口类,但是最近在使用过成中遇到了一个小问题。就是在连续发送数据的时候一直出现发送的数据和接收的数据无法匹配,仅有第一次发送的可以完整匹配上。思考良久,终于找到如下解释:

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

 

我终于明白了,这个类没有办法同步发送数据,看它的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

 

由于采用异步发送, 在它的那个线程里面, 只发送一次.
就是说:
m_ser.WriteToPort(chSend);
这句话执行好之后并不是马上发送串口数据
要等进入它的线程之后再发送.
你可以跟踪下是什么时候进入它的线程的.
三句writetoport都会进入这个线程
但是只能执行一个,最后一个.

 

初次使用remonSpekreijse的CSerialPort类。连续几次使用WriteToPort的时候总是只有最后一次的发送出去。。。不知道什么原因。有用过的请指点一下。谢谢
答:对串口的操作,最好还是用Win32API函数。
答:自己顶一下
答:给你个简单的方法,在发送一个命令后,Sleep(10),然后发送下一个数据。因为这个类里在缓冲区没有发送完又发送新的数据的时候,会先请空缓冲区,再把新数据放入缓冲区,由于串口发送数据没有程序运行的快,造成只能发送一个命令的假象。最简单办法,发送后加个Sleep即可
答:我也遇到相同的问题了楼主有没解决啊zzmwz的方法不行啊。我的是通过串口循环发送数据我的就是每发送一次后SLEEP(100)但还是不行很有趣的是,有最前面一个和最后面一个非常奇怪
答:贴代码出来看看
答:这个怎么没有下文了呢,我也碰到这种情况了,原先用Sleep还有用,最近不知道怎么回事,有时候会丢失,有时候不会。楼主和大家有没有解决呢!
答:把它发送前清空发送缓冲区的代码去掉
答:这个类需要改写一下,它不能发字节型值为0的字符
答:不使用writeevent就可以了。

 

原创粉丝点击