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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值