最近在整理文件的时候发现了原先写的一个串口程序,为了提高重用性就又重新的写了一下。根据以前的使用过的一系列串口操作软件发现,大多数的串口操作软件不具备自动的记录保存功能,于是我就在这里把它加进去,记录文件是在应用程序目录下已时间命名的文本文件。现在发布的这个程序还有一些功能没有实现不过这不影响使用。如果有需要大家可以自行添加代码。下面我主要说明一下程序的核心类CSuperSerialPort。
该类主要功能有:
1.控制串口收发数据并利用window系统的消息来转发接收到的数据。
2.支持一个CSuperSerialPort对象向多个窗口发送数据。
3.支持发送大块数据。
4.支持动态设置收发缓存区大小。
5.支持利用外部线程进行文件传输。
6.支持收发数据统计。
7.支持自定义错误信息。
该类还有两个辅助的结构体WIN_ARG和tagPackage。
WIN_ARG是窗体描述结构体,该结构体包含了窗体指针、自定义消息和位置ID。
typedef struct WIN_ARG
{
UINT winId;
CWnd* pWin;
DWORD msg;
}WINARG, *pWINARG;
tagPackage是数据包描述结构体,该结构体包含了数据长度、数据类别和数据值。CSuperSerialPort利用这个结构体来分解大块数据然后发送。
typedef struct tagPackage
{
enum emMaxSize
{ emMAX_SIZE = 1024 };
UINT iLen;
UINT iType;
BYTE pData[emMAX_SIZE];
}PACKAGE, * pPACKAGE;
在串口程序的开发过程中,最麻烦的问题就是需要事先确定缓存区的大小。如果传输时按协议传输这个一般没什么问题,但是如果按一个字节一个字节的进行传输,那么在收数据的时候就很麻烦。解决这一问题时我利用了串口中cbInQue这一属性,同时为了提高程序的性能启用了一个接收线程,并将收下来的数据都发往指定的窗体对象然后再进行处理。如:
pPACKAGE pPack = new PACKAGE;
DWORD rdLen = pCom->m_comState.cbInQue;
pPack->iLen = rdLen;
为了协同串口的收发,在初始化串口的时候要启用FILE_FLAG_OVERLAPPED这一属性,如
CreateFile(m_com.com,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
当然在接收的线程中还加入了互斥对象和临界区用于控制线程和数据统计。如果你直接使用CSuperSerialPort类,程序已经替你完成了这些任务。如:
m_pSSP->Open(m_comName, m_uComRate, m_uComParity, m_uComDataBits, m_fComStopBits);
m_pSSP->StartReceive(m_pSSP)
详细情况可以参照TestSerialPort2Dlg.cpp中的代码。
为了解决一个串口实例向多个窗口显示数据问题,我在CSuperSerialPort类中添加了一个窗体向量表typedef vector<WIN_ARG> vWINLIST;你可以通过Attach和Detach函数来控制窗体数量。如果需要添加其他的功能到CSuperSerialPort类中,有三种方法可以实现:
1.直接修改CSuperSerialPort类代码。
2.继承CSuperSerialPort类。
3.调用GetComHandle返回串口句柄。
开端串口助手java 串口开发
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
PSoc™62开发板之串口通信
使用板载uart0和PC、GNSS模块通信
Infineon RT-Thread PSoc™62 uart GNSS -
android蓝牙串口助手开发 安卓 蓝牙串口助手
蓝牙模块的调试,在我们本文中,主要是蓝牙模块通过发送或接收空间电磁信号,进而通过此种方式与手机app或者电脑客户端进行数据的交互,使用蓝牙自己的接收与发送功能进行数据的收发。蓝牙接收数据后,通过其既有的与STM32F407相连接的串口进行数据交互(在我们本板中,蓝牙与STM32核心交互为通过串口2,即UART2来进行交互的)。 如上
android蓝牙串口助手开发 stm32串口调试助手 xcom串口调试助手 组态王调用串口调试工具 串口