




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、该程序全部由C写成没有C+更没用MFC完全是自娱自乐给需要的人一个参考#include stdafx.h#include #include resource.h#include MainDlg.h#include #include #include HANDLE hComm;/用于获取串口打开函数的返回值(句柄或错误值) OVERLAPPED m_ov;COMSTAT comstat;DWORD m_dwCommEvents;TCHAR cRecs200,cSends100; 接/收字符串发送字符串char j=0,*cCom; /接收用统计数据大小变量端口选择BOOL WINAPI Main
2、_Proc(HWND hWnd, UINT uMsg, WPARAM wParam,LPARAM lParam)switch(uMsg)HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);return FALSE;/* 系统初始化函数 */BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAMlParam)HWND hw
3、ndCombo1=GetDlgItem(hwnd,IDC_COMBO1);ComboBox_InsertString(hwndCombo1,-1,TEXT(COM1);ComboBox_InsertString(hwndCombo1,-1,TEXT(COM2);ComboBox_InsertString(hwndCombo1,-1,TEXT(COM3);ComboBox_InsertString(hwndCombo1,-1,TEXT(COM4);ComboBox_InsertString(hwndCombo1,-1,TEXT(COM5);ComboBox_SetCurSel(hwndCombo
4、1,0);void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID,DWORD dwTime);SetTimer(hwnd,1,1000,TimerProc);return TRUE;/* 监视串口错误时使用的函数 */boolProcessErrorMessage(char* ErrorText)char *Temp = new char200;LPVOID lpMsgBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM,N
5、ULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), / Defaultlanguage(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;
6、return true;boolopenport(char *portname)/ 打开串口hComm = CreateFile(portname, /串 口号 “ comT “ cc调用方法:bool open;open=openport(com2);GENERIC_READ | GENERIC_WRIT允许读写0, /通讯设备必须以独占方式打开0, / 无安全属性OPEN_EXISTING,通讯设备已存在FILE_FLAG_OVERLAPPED异步 I/O0); /通讯设备不能用模板打开if (hComm = INVALID_HANDLE_VALUE如/果被占用或是没有打开时返回的 是这个
7、错误代码CloseHandle(hComm);return FALSE;elsereturn true;boolsetupdcb(intrate_arg)/ 设置 port 的属性DCB dcb;int rate= rate_arg;memset(&dcb,0,sizeof(dcb);if(!GetCommState(hComm,&dcb)获取当前 DCB配置return FALSE;/ set DCB to configure the serial portdcb.DCBlength = sizeof(dcb);dcb.BaudRate = rate;dcb.Parity = NOPARIT
8、Y; 奇/ 偶校验值 04分别对应无校验、奇校验、偶校 验、校验置位、校验清零dcb.fParity = 0; /为 1的话激活奇偶校验检查dcb.StopBits = ONESTOPBIT停止位个数,02分别对应1位、1.5位、2位 停止位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;
9、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;/ set DCBif(!SetCommState(hComm,&dcb)return false;elsereturn true;/* 串口读取相关时间设置 */boolsetuptimeout(DWORDReadInte
10、rval,DWORDReadTotalMultiplier,DWORDReadTotalconstant,DWORDW riteTotalMultiplier,DWORDWriteTotalconstant)COMMTIMEOUTS timeouts;timeouts.ReadIntervalTimeout=ReadInterval; / 读取两个字节间隔最大值 mS 如超过立即返回不再读取timeouts.ReadTotalTimeoutConstant=ReadTotalconstant; /如果同下面一个都 为 0 则无论是否读到数据都返回/ 可以毫秒为单位指定一个乘数,该乘数用来计算读
11、操作的总限时时间 timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier; / 以毫秒为单位指定一 个常数,用于计算读操作的总限时时间 0 表示不限时timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;/ 写操作延时同上timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;if(!SetCommTimeouts(hComm, &timeouts)return false;elsereturn true;intClearn(
12、) / 清除 buff 中的内容并返回 buff 中现有数据量的大小并读取错误 原因DWORD dwError = 0;DWORD BytesRead = 0;ClearCommError(hComm, &dwError, &comstat);return comstat.cbInQue; / 返回 buff 中数据量/* 串口数据接收读取函数 */void ReceiveChar()BOOL bRead = TRUE;BOOL bResult = TRUE;DWORD dwError = 0;DWORD BytesRead = 0;char i=0,n;char RXBuff;j=0;whi
13、le (i-n)n=i;Sleep(10);bResult = ClearCommError(hComm, &dwError, &comstat); i=(char)comstat.cbInQue;for (;i0;i-)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 structure/ prin
14、tf(%c,RXBuff);cRecsj+=(char)RXBuff;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, / St
15、ores number of bytes readTRUE); / Wait flagboolWriteChar(char* m_szWriteBuffer,DWORDm_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, / Ha
16、ndle 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 G
17、etOverlappedResults()BytesSent = 0;bWrite = FALSE;break;default:/ all other error codesbreak; / 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 er
18、ror codeif (!bResult)printf(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; MessageLength: %dn, BytesSent, strlen(char*)m_szWriteBuffer);return true;/*w
19、indow 时间函数回调 */void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID,DWORD dwTime)SYSTEMTIME time; /定/ 义机构体变量 timeGetLocalTime(&time); / 取系统时间以指针方式TCHAR strTime256; /程序只有一个作用wsprintf(strTime,%04d-%02d-%02d %02d:%02d:%02d,time.wYear, /就/ 是读 取系统时间time.wMonth,time.wDay,time.wHour,time.wMinute
20、,time.wSecond);/ 然后写进 strTimeSetDlgItemText(hwnd,IDC_TIME,strTime); /这/ 个字符串void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINTcodeNotify)switch(id)case IDC_SEND:GetDlgItemText (hwnd,IDC_EDIT2,cSends,sizeof(cSends);un sig ned n二sizeof(cSe nds); n是通知串口将发送字节的长度char send100;wsprintf (send,%s,cSends);WriteChar(send,n-1);SetCommMask(hComm, EV_RXCHAR)监视串口是否接收有数据ReceiveChar(); /读取串口 sbuff 中数据cRecsj=0; / 将 cRecs转为字符串SetDlgItemText(hwnd,IDC_EDIT1,cRecs); break;/*case IDC_RECEIVE暂时未用采用直接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 荆州理工职业学院《中医养生康复学》2023-2024学年第二学期期末试卷
- 山东省临沂市莒南县市级名校2024-2025学年初三模拟考试(二)英语试题试卷含答案
- 南宁学院《书法艺术》2023-2024学年第一学期期末试卷
- 江苏农牧科技职业学院《中医典籍导读》2023-2024学年第一学期期末试卷
- 2025年图书馆信息学专业考试试题及答案
- 2025年营销专员职业能力考试试题及答案
- 2025年数字媒体艺术专业入学考试试卷及答案
- 四川传媒学院《景观设计方法Ⅰ》2023-2024学年第二学期期末试卷
- 内蒙古科技大学《资源加工工程设计》2023-2024学年第一学期期末试卷
- 天津海运职业学院《英语新闻选读》2023-2024学年第一学期期末试卷
- 【MOOC】行政法与行政诉讼法学-西南政法大学 中国大学慕课MOOC答案
- ARVR在电商设计中的应用与前景
- 宣传工作实务-形考任务三-国开(FJ)-参考资料
- 贵州省遵义市(2024年-2025年小学五年级语文)人教版小升初真题((上下)学期)试卷及答案
- 物流行业综合工时优化方案
- 宫颈癌护理查房-5
- 2023年上海铁路局集团有限公司招聘考试真题
- 中国高血压防治指南(2024年修订版)要点解读
- 轴类零件加工工艺设计-毕业设计论文
- 2024年山东济宁初中学业水平考试地理试卷真题(含答案详解)
- 2024年计算机考试-ISTQB认证考试近5年真题附答案
评论
0/150
提交评论