WinCE之路:3.串口的基本操作,算是一个最简单的调试软件吧

来源:互联网 发布:路由器上mac是什么意思 编辑:程序博客网 时间:2024/06/06 04:14

这个是基于Wince的串口基本操作,上面控件显示的接收的数据,下面用控件来进行发送数据,代码在显示数据时应该还不完善,显示格式有点问题。

LONG DoInit(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){g_hSendEvent = CreateEvent (NULL, FALSE, FALSE, NULL);Edit_SetText(GetDlgItem(hDlg,ID_SENDTEXT),TEXT("AT\r\n"));TCHAR szDev[32] = TEXT("COM2:");InitCommunication (szDev);hwnd = hDlg;return TRUE;}LONG OnClose(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){EndDialog(hDlg,0);return TRUE;}HANDLE InitCommunication ( LPTSTR pszDevName) {DCB dcb;TCHAR szDbg[128];COMMTIMEOUTS cto;HANDLE hLocal;DWORD dwTStat;hLocal = hComPort;hComPort = INVALID_HANDLE_VALUE;if (hLocal != INVALID_HANDLE_VALUE)CloseHandle (hLocal);  hLocal = CreateFile (pszDevName, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);if (hLocal != INVALID_HANDLE_VALUE) {// 配置串口dcb.DCBlength = sizeof (dcb);GetCommState (hLocal, &dcb);dcb.BaudRate = nSpeed;dcb.fParity = FALSE;dcb.fNull = FALSE;dcb.StopBits = ONESTOPBIT;dcb.Parity = NOPARITY;dcb.ByteSize = 8;SetCommState (hLocal, &dcb);// 设定超时cto.ReadIntervalTimeout = 0;cto.ReadTotalTimeoutMultiplier = 0;cto.ReadTotalTimeoutConstant = 0;cto.WriteTotalTimeoutMultiplier = 0;cto.WriteTotalTimeoutConstant = 0;SetCommTimeouts (hLocal, &cto);// 启动读取线程hComPort = hLocal;if (!GetExitCodeThread (hReadThread, &dwTStat) ||(dwTStat != STILL_ACTIVE)) {hReadThread = CreateThread (NULL, 0, ReadThread, NULL,0, &dwTStat);if (hReadThread)CloseHandle (hReadThread);hThread = CreateThread (NULL, 0, SendThread, NULL, 0, NULL);if (hThread)CloseHandle (hThread);}} else {wsprintf (szDbg, TEXT ("Couldn\'t open port %s. rc=%d\r\n"),pszDevName, GetLastError());MessageBox(NULL,szDbg,TEXT("message"),MB_OK | MB_ICONERROR);}return hComPort;}LONG OnInitComm(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){int i =0;TCHAR szDev[32];HWND hlist = GetDlgItem(hDlg,IDC_LIST1);ListBox_GetCurSel(hDlg,i);if (i >= 0){ListBox_GetText(hlist,i,szDev);InitCommunication (szDev);}return TRUE;}LONG OnSendComm(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){    SetEvent (g_hSendEvent);return TRUE;}DWORD WINAPI SendThread (PVOID pArg) {HWND  hwndSText;int rc;DWORD cBytes;WCHAR szText[TEXTSIZE];char szAnsi[TEXTSIZE];size_t siz;//hWnd = (HWND)pArg;hwndSText = GetDlgItem (hwnd, ID_SENDTEXT);while (1) {rc = WaitForSingleObject (g_hSendEvent, INFINITE);if (rc == WAIT_OBJECT_0) {if (!fContinue)break;// 获得发送内容并转换成asci码GetWindowText (hwndSText, szText, dim(szText));StringCchCat (szText, dim(szText), TEXT ("\r\n"));wcstombs_s (&siz, szAnsi, sizeof (szAnsi), szText, _TRUNCATE);// 写入到串口rc = WriteFile(hComPort,szAnsi,strlen(szAnsi),&cBytes,0);//rc = WriteFile (hComPort, szText, //lstrlen (szText)*sizeof (TCHAR),&cBytes, 0);if (!rc) {// 如果写入失败,提示错误信息wsprintf (szText, TEXT ("Send failed rc=%d\r\n"), GetLastError());DWORD dwErr = 0;COMSTAT Stat;if (ClearCommError (hComPort, &dwErr, &Stat)) {MessageBox(NULL,szText,TEXT("message"),0);}}} elsebreak;}return 0;}DWORD WINAPI ReadThread (PVOID pArg) {DWORD cBytes, i;WCHAR szText[TEXTSIZE];char szAnsi[TEXTSIZE];size_t siz;HWND hlist = GetDlgItem(hwnd,IDC_LIST1);while (fContinue) {for (i = 0; i < sizeof (szAnsi)-1; i++) {while (!ReadFile (hComPort, &szAnsi[i], 1, &cBytes, 0))if (hComPort == INVALID_HANDLE_VALUE)return 0;if (szAnsi[i] == '\0') {szAnsi[i+1]='\n';break;}}mbstowcs_s (&siz, szText, dim (szText), szAnsi, _TRUNCATE);ListBox_InsertString(hlist,0,szText);}return 0;}


0 0
原创粉丝点击