最近的一个项目中有用到了串口通信,运行平台再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文件:

此处内容需要评论回复后(审核通过)方可阅读。

最后修改:2019 年 10 月 24 日
如果觉得我的文章对你有用,请随意赞赏