这个是基于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);
}
}
} else
break;
}
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;
}