logo资料库

C语言串口助手.docx

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
该程序全部由 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 cRecs[200],cSends[100]; //接收字符串 发送字符串 char j=0,*cCom; //接收用统计数据大小变量 端口选择 BOOL WINAPI Main_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, LPARAM lParam) { HWND hwndCombo1=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(hwndCombo1,0); void CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime); SetTimer(hwnd,1,1000,TimerProc); return TRUE; } /*监视串口错误时使用的函数*/ bool ProcessErrorMessage(char* ErrorText) { char *Temp = new char[200]; 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%s\nPort: %d\n", (char*)ErrorText, lpMsgBuf, "com2"); MessageBox(NULL, Temp, "Application Error", MB_ICONSTOP); LocalFree(lpMsgBuf); delete[] Temp; return true; } bool openport(char *portname)//打开串口 { hComm = CreateFile(portname, //串口号 “com1”“com2” 调用方法:bool open; open=openport("com2"); GENERIC_READ | GENERIC_WRITE, //允许读写 0, //通讯设备必须以独占方式打开 0, //无安全属性 OPEN_EXISTING, //通讯设备已存在 FILE_FLAG_OVERLAPPED, //异步 I/O 0); //通讯设备不能用模板打开 if (hComm == INVALID_HANDLE_VALUE) //如果被占用或是没有打开时返 回的是这个错误代码
{ CloseHandle(hComm); return FALSE; } else return true; } bool setupdcb(int rate_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 port dcb.DCBlength = sizeof(dcb); dcb.BaudRate = rate; dcb.Parity = NOPARITY; //奇偶校验值 0~4 分别对应无校验、奇校验、偶校 验、校验置位、校验清零 dcb.fParity = 0; //为 1 的话激活奇偶校验检查 dcb.StopBits = ONESTOPBIT;//停止位个数,0~2 分别对应 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; 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 DCB if(!SetCommState(hComm,&dcb)) return false; else return true;
} /*串口读取相关时间设置*/ bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,DWORD WriteTotalMultiplier,DWORD WriteTotalconstant) { COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout=ReadInterval; //读取两个字节间隔最大值 mS 如超过立即返回不再读取 timeouts.ReadTotalTimeoutConstant=ReadTotalconstant; //如果同下面一 个都为 0 则无论是否读到数据都返回 // 可以毫秒为单位指定一个乘数,该乘数用来计算读操作的总限时时间 timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier; // 以毫秒为单 位指定一个常数,用于计算读操作的总限时时间 0 表示不限时 timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;// 写操作延时 同上 timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier; if(!SetCommTimeouts(hComm, &timeouts)) return false; else return true; } int Clearn() //清除 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; while (i-n) { n=i; Sleep(10); bResult = ClearCommError(hComm, &dwError, &comstat); i=(char)comstat.cbInQue;
分享到:
收藏