




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
自己动手编写串口动态库手把手教你编写串口调试助手,单片机串口程序一、串口库源码: 自行在vc6中建立动态库工程#include stdafx.h#include #include #include #include #includeresource.h/*导出函数*/函数参数:串口名:com1 波特率:9600 用于显示接收数据的文本框的句柄extern C _declspec(dllexport) void Entry(char *comname, int BaudRate, HWND rhbox);extern C _declspec(dllexport) bool openport(char *portname);extern C _declspec(dllexport) bool setupdcb(int rate_arg);extern C _declspec(dllexport) void SetTimeOut(int a, int b, int c, int d, int e);/发送字符或16进制数extern C _declspec(dllexport) void SendChar(unsigned char ch);/显示方式:1:hex 0:charextern C _declspec(dllexport) void DisplayHex(int flag);extern C _declspec(dllexport) void Close();/只使用上面有注释的三个函数即可HANDLE hComm;/串口的句柄OVERLAPPED m_ov;/是一个包含了用于异步输入输出的信息的结构体COMSTAT comstat;/包含串口结构信息HANDLE hThread1; /读线程句柄HANDLE hThread2; /写线程句柄HWND hRbox;bool sendflag = false;unsigned char sendchar, receivechar;bool DisplayHEX = false;ProcessErrorMessage(char* ErrorText)/打印进程错误信息char *Temp = new char200;LPVOID lpMsgBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), / Default language(LPTSTR)&lpMsgBuf,0,NULL);sprintf(Temp, WARNING: %s Failed with the following error: n%snPort: %dn, (char*)ErrorText, lpMsgBuf, com2);MessageBox(NULL, Temp, Application Error, MB_ICONSTOP);LocalFree(lpMsgBuf);delete Temp;return true;/*打开串口*/bool openport(char *portname)hComm = CreateFile(portname,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);if (hComm = INVALID_HANDLE_VALUE)return FALSE;elsereturn true;/*设备控制块的设置*/参数 波特率rate_arg: 9600bool setupdcb(int rate_arg)DCB dcb;int rate = rate_arg;memset(&dcb, 0, sizeof(dcb); /申请一个DCB结构体空间if (!GetCommState(hComm, &dcb)/获取当前DCB配置ProcessErrorMessage(GetCommState();/打印错误信息return FALSE;/* - */ 配置当前串口dcb.DCBlength = sizeof(dcb);/* -串口的配置 - */dcb.BaudRate = rate;dcb.Parity = NOPARITY;dcb.fParity = 0;dcb.StopBits = ONESTOPBIT;dcb.ByteSize = 8;dcb.fOutxCtsFlow = 0;dcb.fOutxDsrFlow = 0;dcb.fDtrControl = DTR_CONTROL_DISABLE;dcb.fDsrSensitivity = 0;dcb.fRtsControl = RTS_CONTROL_DISABLE;dcb.fOutX = 0;dcb.fInX = 0;/* -其他参数的设置 - */dcb.fErrorChar = 0;dcb.fBinary = 1;dcb.fNull = 0;dcb.fAbortOnError = 0;dcb.wReserved = 0;dcb.XonLim = 2;dcb.XoffLim = 4;dcb.XonChar = 0x13;dcb.XoffChar = 0x19;dcb.EvtChar = 0;/* - */ 用上面的设备控制块来设置当前串口if (!SetCommState(hComm, &dcb)ProcessErrorMessage(SetCommState();return false;elsereturn true;/设置成功/*超时的设置*/bool setuptimeout(int ReadInterval, int ReadTotalMultiplier, int ReadTotalconstant, int WriteTotalMultiplier, int WriteTotalconstant)COMMTIMEOUTS timeouts;timeouts.ReadIntervalTimeout = ReadInterval;/ 读间隔超时timeouts.ReadTotalTimeoutConstant = ReadTotalconstant;/ 读时间常量timeouts.ReadTotalTimeoutMultiplier = ReadTotalMultiplier;/ 读时间系数timeouts.WriteTotalTimeoutConstant = WriteTotalconstant;/ 写时间常量timeouts.WriteTotalTimeoutMultiplier = WriteTotalMultiplier;/ 写时间系数if (!SetCommTimeouts(hComm, &timeouts)/设置当前串口的超时设置ProcessErrorMessage(SetCommTimeouts();return false;elsereturn true;void ReceiveChar()BOOL bRead = TRUE;BOOL bResult = TRUE;DWORD dwError = 0;DWORD BytesRead = 0;char RXBuff;/接收数据缓冲器char str10;for (;)/死循环等待Sleep(100);bResult = ClearCommError(hComm, &dwError, &comstat);/清除硬件的通讯错误以及获取通讯设备的当前状态if (comstat.cbInQue = 0)continue;if (bRead)bResult = ReadFile(hComm, / Handle to COMM port&RXBuff, / RX Buffer Pointer1, / Read one byte&BytesRead, / Stores number of bytes read&m_ov); / pointer to the m_ov structureif (DisplayHEX)/printf(0x%08x , RXBuff);/打印接收到的数据sprintf(str, 0x%08x , RXBuff);SetWindowText(hRbox, str);else/printf(%c, RXBuff);/打印接收到的数据sprintf(str, %c, RXBuff);SetWindowText(hRbox, str);if (!bResult)/读不成功switch (dwError = GetLastError()case ERROR_IO_PENDING: bRead = FALSE; break;default: break;elsebRead = TRUE; / close if (bRead)if (!bRead)bRead = TRUE;bResult = GetOverlappedResult(hComm, / Handle to COMM port&m_ov, / Overlapped structure&BytesRead, / Stores number of bytes readTRUE); / Wait flagWriteChar(BYTE* m_szWriteBuffer, DWORD m_nToSend)BOOL bWrite = TRUE;BOOL bResult = TRUE;DWORD BytesSent = 0;HANDLE m_hWriteEvent;ResetEvent(m_hWriteEvent);if (bWrite)m_ov.Offset = 0;m_ov.OffsetHigh = 0;/ Clear bufferbResult = WriteFile(hComm, / Handle to COMM Portm_szWriteBuffer, / Pointer to message buffer in calling finctionm_nToSend, / Length of message to send&BytesSent, / Where to store the number of bytes sent&m_ov); / Overlapped structureif (!bResult)DWORD dwError = GetLastError();switch (dwError)case ERROR_IO_PENDING: / continue to GetOverlappedResults() BytesSent = 0; bWrite = FALSE; break;default: / all other error codes ProcessErrorMessage(WriteFile(); / end if(bWrite)if (!bWrite)bWrite = TRUE;bResult = GetOverlappedResult(hComm, / Handle to COMM port&m_ov, / Overlapped structure&BytesSent, / Stores number of bytes sentTRUE); / Wait flag/ deal with the error codeif (!bResult)ProcessErrorMessage(GetOverlappedResults() in WriteFile(); / end if (!bWrite)/ Verify that the data size send equals what we tried to sendif (BytesSent != m_nToSend)printf(WARNING: WriteFile() error. Bytes Sent: %d; Message Length: %dn, BytesSent, strlen(char*)m_szWriteBuffer);return true;/读线程DWORD WINAPI MyThread1(LPVOID pParam)ReceiveChar();return 0;/写线程DWORD WINAPI MyThread2(LPVOID pParam)while (hComm != INVALID_HANDLE_VALUE) / 串口已被成功打开Sleep(100);/等待100毫秒if (sendflag)WriteChar(&sendchar, 1);sendflag = false;/发送return 0;/*函数名Entry参数comname:串口名BaudRate:波特率*/void Entry(char *comname, int BaudRate, HWND rhbox)hRbox = rhbox;if (openport(comname)printf(open comport successn);if (setupdcb(BaudRate)printf(setupDCB successn);if (setuptimeout(0, 0, 0, 0, 0)printf(setuptimeout successn);/清空缓冲区 PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);hThread1 = CreateThread(NULL, 0, MyThread1, 0, 0, NULL); /读线程hThread2 = CreateThread(NULL, 0, MyThread2, 0, 0, NULL); /写线程/*设置显示*/void DisplayHex(int flag)if (flag = 0)DisplayHEX = false;elseDisplayHEX = true;/*设置超时*/void SetTimeOut(int a, int b, int c, int d, int e)if (setuptimeout(a, b, c, d, e)printf(setuptimeout successn);/*发送数据*/void SendChar(unsigned char ch)sendchar = ch;sendflag = true;/通知发送线程发送数据/*关闭*/void Close()CloseHandle(hThread1);/关闭都线程CloseHandle(hThread2);/关闭写线程CloseHandle(hComm);/关闭串口二、验证是否成功把DLL放在EXE一起三、验证串口库代码:#pragma comment(lib,libserialport.lib)extern C_declspec(dllimport)void Entry(char *comname, int BaudRate, NULL);extern C_declspec(dllimport) void SendChar(unsigned char ch);extern C_declspec(dllimport) void Close();extern C_declspec(dllimport) void DisplayHex(int flag);#include#includeint main()char ch;Entry(com4, 9600, NULL);/根据需要设置串口号DisplayHex(0);Sleep(2000);SendChar(A);/测试字符Sleep(2000);SendChar(B);Sleep(2000);DisplayHex(1);SendChar(0x00);Sleep(2000);SendChar(0xf3);/测试16进制数Sleep(2000);SendChar(0xff);Sleep(2000);Close();/关闭串口return 0;四、(可选)编写窗口程序可以看出不用MFC编写的串口程序体积非常小五、单片机上的程序#include#define jingzhen UL#define botelv 9600UL/定义波特率为9600volatile unsigned char sending, r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南充职业技术学院2025年引进高层次人才公开考核招聘岗位调整考试备考试题及答案解析
- 2025安康鸿志学校招聘笔试模拟试题及答案解析
- 红楼梦贾宝玉课件
- 2025江西吉安遂川县城控人力资源管理有限公司招聘物管员1人笔试参考题库附答案解析
- 青岛济南高一下数学试卷
- 2025四川攀枝花市第二批 农业技术 (经济)助理岗招聘88人笔试参考题库附答案解析
- 2025广东广州市白云区54所公办中小学招聘各科临聘教师152+人笔试模拟试题及答案解析
- 2025年初三数学初考试卷及答案
- 2025年充气考试题及答案
- 2025年甘肃省陇南市西和县成名高级中学招聘宿舍管理人员12人考试备考题库及答案解析
- 光伏焊带完整版本
- 双镜联合手术案例分享
- 质量通病案例课件
- 南航SVC大数据支撑案例
- 2024新课标《义务教育数学课程标准(2022年版)》测试题(含答案)
- 《如何做好研究生》课件
- 35kV高压开关柜的检修和维护
- 铁路路基的基本知识-路堤和路堑的构造(铁路路基施工)
- 新能源电站远程监控系统建设方案
- 读书分享读书交流会《活着》课件
- 2020-2021成都电子科技大学实验中学小学数学小升初试题及答案
评论
0/150
提交评论