最近的一个项目中有用到了串口通信,运行平台再Wince下.虽然通信方面是学长在弄,但是自己由于先完成了自己的任务,所以就也试着弄弄通信方面的知识,也算是给自己增长一点经验吧.
在x86测下下无问题后,去设备上调试,结果接收不到数据,整了两三个星期,确定代码没问题后,请教了那边的工作人员,结果发现是波特率设置错了........因为当初开发文档也并没有提及到这些参数,所以就用上了一些常用的值,浪费了大把时间,还好最终调好了.接下来就是根据文档去进行一些相关的补充了.
另外,在Wince下和Win10下测试的时候,结果不同,在Win10,同步模式打开串口,读线程中的一个WaitCommEvent()函数会将串口堵塞,而在Wince下则没这个问题,这个问题网络上也有解决的方案,就是在Win10下改用异步模式(我试着改了改,但是好像还是有点小问题,不能正常接收).但是在Wince下又不能用异步模式(奇葩..),所以也就没有去继续探索原因了.
这个模块也经过了两三次改进,结合了一些网上的写法,然后加了一些自己的理解,比如发送用一个单独的线程,接收也用一个单独的线程,以免界面的卡死.用队列来发送消息等等.接下来有需求的话还会进一步改进的.
//头文件
#ifndef QT4SERIALPORT_H
#define QT4SERIALPORT_H
#include <Windows.h>
#include <QString>
#include <QMutex>
#include <QQueue>
struct WriteMsg
{
unsigned char *data;
int len;
};
class Qt4SerialPort
{
public:
Qt4SerialPort();
bool openPort(UINT portNo);
void initCom();
bool readData(char *str);
bool writeData(unsigned char *str, int len);
void closePort();
void sendData(WriteMsg);
static HANDLE hCom; //全局变量,串口句柄
private:
COMMTIMEOUTS timeOuts;
DCB dcb;
static QQueue<WriteMsg> queue;
HANDLE readThread;
HANDLE writeThread;
static bool threadState;
static DWORD WINAPI ReadThreadFunc(LPVOID lparam);
static DWORD WINAPI WriteThreadFunc(LPVOID lparam);
static QMutex wMute;
};
#endif // QT4SERIALPORT_H
Cpp文件:
此处内容需要评论回复后(审核通过)方可阅读。
3 comments
想看看
给我看看的
了解一下