c 串口通信信中关于CSerialPort类中的RecvData怎么使用

The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.串口通信CSerialPort类WriteToPort不能连续发送的问题
&在串口通信中使用CSerialPort时,发现连续发送有问题,比如,连续发了三个数组:m_serial.WriteToPort(chSend1); m_serial.WriteToPort(chSend2); m_serial.WriteToPort(chSend2); //chSend1,chSend2,chSend3是数组首地址.只有最后一个数组发送成功,开始以为这个类不能连续发送数据,但是后来发现如果写成这个样子:m_serial.WriteToPort(chSend1); AfxMessageBox(&&); m_serial.WriteToPort(chSend2); AfxMessageBox(&&); m_serial.WriteToPort(chSend3); AfxMessageBox(&&); 三个数组的数据就都能发出去,这是为什么呢?=========================================这个要看CSerialPort是怎么做出来的,也就是从Windows的串口编程说起。在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但是控件只能在对话框中使用。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。CSerialPort类就是对串口的API函数封装。与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。由于是作为文件来处理,我们看看windows API中打开串口的函数:HANDLE CreateFile( LPCTSTR lpFileName, //将要打开的串口逻辑名,如“COM1”; DWORD dwDesiredAccess, //指定串口访问的类型,可以是读取、写入或二者并列;DWORD dwShareMode, //指定共享属性,由于串口不能共享,该参数必须置为0; LPSECURITY_ATTRIBUTES lpSecurityAttributes, //引用安全性属性结构,缺省值为NULL; DWORD dwCreationDistribution, //创建标志,对串口操作该参数必须置为OPEN_EXISTING;DWORD dwFlagsAndAttributes, //属性描述,用于指定该串口进行异步或同步操作;HANDLE hTemplateFile); //对串口而言该参数必须置为NULL;=========================================请务必注意倒数第二个参数dwFlagsAndAttributes,它指示了串口进行异步或同步操作。还请注意这里的同步和异步不是指的数据通信里时钟的同步和异步。这里的同步和异步指的是:同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而异步(重叠)操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。dwFlagsAndAttributes该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作。既然CSerialPort类是对API函数的封装,我们有理由相信在它的实现里面必定有CreateFile函数,打开它的cpp来看,果然可以搜索的到,再看看它是怎么设置的:m_hComm = CreateFile(szPort,&&& && // communication port string (COMX)GENERIC_READ | GENERIC_WRITE,&&& // read/write types0,&&& &&& &&& &&& &&& &&& &&& &&& // comm devices must be opened with exclusive accessNULL,&&& &&& &&& &&& &&& &&& &&& // no security attributesOPEN_EXISTING,&&& &&& &&& &&& &&& // comm devices must use OPEN_EXISTINGFILE_FLAG_OVERLAPPED,&&& & // Async I/O0);&&& &&& &&& &&& &&& &&& &&& // template must be 0 for comm devices可以看到倒数第二个参数设为FILE_FLAG_OVERLAPPED,即异步发送。=========================================其实问题就在这里,异步发送的话就造成文章一开始说的两个现象。先说第一个现象:为什么三个数组中只发送了最后一个数组?因为采用了异步操作,在执行到m_serial.WriteToPort(chSend1); 时,并不马上发送串口数据,而是要等进入CSerialPort的线程之后再发送(如果是同步操作,则程序停在那里等发送完成)。你可以跟踪一下程序,看是什么时候进入它的线程的,三句WriteToPort都会进入这一个线程,而不是三个线程,在这个线程中只发送一次数据,数据的来源就是形参最后的更新,所以就是第三个数组了。第二个现象:为什么加了AfxMessageBox(&&); 就都可以发送?因为AfxMessageBox(&&); 使程序的进程被挂起,这样CSerialPort的线程就得以运行,所以就发送了。=========================================看到这里你可能会想:那能不能将dwFlagsAndAttributes改成0设为同步发送?答案是好像不可以,可能还需要改其他地方,光这里改成同步的话,串口什么数据也发不了。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
1.DCB:串口属性的一个数据结构2.RTS:3.DCE:数据通信设备4.DTE:数据终端设备5.RS232:全称EIA-RS-232-C,EIA代表美国电子工业协会,RS(Recommended standard)代表推荐标准,232是标识号,C是版本号(之前还有A,B):而232代表的是&DTE和DCE之间串行二进制数据交换接口技术标准&quo ...
Qt串口通信QextSerialPort类 Qt
莫名的不开心……生活的如此扎乱无章,有心却无力改变,忙碌却感到无比的空虚,元宵夜,空荡荡的天空中多了许多烟花的点缀,却发现月儿在烟花的衬托中是如此的美丽.但心情却分外的哀伤,找不到理由,也许是一天天格外的拥忙 ...
这是从网上down下来的一个串口通信类,发现close函数忘记了设置Opened属性为false还有后面string转byte[]和byte[]转string的函数有错误,索性删掉了修改后的串口通信类如下:下一篇将把我的测试程序主程序部分全部代码贴出来可以坚强勇敢的用来实现串口通信.using Susing System.Runtime.Inte ...
有网友也提到qt第三方类的flush函数不好用的观点,我最近正好在做一个程序,自己起一个读线程一个写线程,通过切换变量控制读写,就像单刀双置开关一样.没办法,对方的通信协议定的这样,不过这种办法虽随不是异步通信,但保障了安全,两个线程绝对不会串在一起,然后通过回传机制检验数据正确性.我就发现一点奇怪之处,当我每次点发送之前,我用了flush函数 ...
源码如下: #include &stdio.h& #include &string.h& #include &sys/types.h& #include &errno.h& #include &sys/stat.h& #include &fcntl.h& #include &uni ...
using Susing System.Runtime.InteropS namespace JustinIO { class CommPort
public int PortN //1,2,3,4
public int BaudR //00,9600
public byte
串口一旦存在后,C++ boost::asio就当串口为一种流(文件流 )来使用. C++的BOOST库中,通信库都在asio下,串口类结构为boost::asio::serial_port.串口通信由asio组件的serial_port类完成.BOOST库下的串口通信serial_port类的使用跟网络通信相似[网络通信 ],只是在进行串口通信前需要初始化 ...

我要回帖

更多关于 c 串口通信实例 的文章

 

随机推荐