裝置與微控制器串列埠通訊程式,寫了兩個執行緒SendThread 和ReadThread,單擊發送按鈕傳送執行緒傳送一組命令資料到微控制器,微控制器再返回一組資料,讀執行緒把資料顯示在編輯框裡。求解怎麼才能設定單擊一次按鈕,實現比如1分鐘內傳送600次資料,接收600次呢。
C/C++ code?
LONG OnSendComm(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
return TRUE;
}
BYTE ConvertHexChar(BYTE ch)
{
if((ch>=‘0’)&&(ch<=‘9’))
return ch-0x30;
else if((ch>=‘A’)&&(ch<=‘F’))
return ch-‘A’+10;
else if((ch>=‘a’)&&(ch<=‘f’))
return ch-‘a’+10;
else
return -1;}
DWORD WINAPI SendThread (PVOID pArg) {
HWND hwndSText;
DWORD cBytes;
WCHAR szText[TEXTSIZE];
WCHAR szText1[TEXTSIZE];
WCHAR szText2[TEXTSIZE];
WCHAR szTextt[TEXTSIZE];
WCHAR szTexto[TEXTSIZE];
char szAnsi[TEXTSIZE];
size_t siz;
BYTE tmpByte=0x00;
int strLen=sizeof(szAnsi)-1;
BYTE cmd[TEXTSIZE];
byte cmd1,cmd2;
memset(cmd,‘\0’,sizeof(cmd));
hwndSText = GetDlgItem (hwnd, ID_SENDTEXT);
for(int i=0;i<599;i++){ //傳送600次 每次間隔100ms
Sleep(100);
if(WaitForSingleObject(g_hSendEvent,-1)==WAIT_OBJECT_0)
{
// 獲得傳送內容並轉換成asci碼
GetWindowText (hwndSText, szText, dim(szText));
swscanf(szText,L“%[^ ]”,szText1);
swscanf(szText,L“%*s%s”,szText2);
byte cmd1=wcstol(szText1,NULL,16);
limit=wcstol(szText2,NULL,10);
byte cmd2=0x68+0xA1+0x04+cmd1;
wsprintf(szTexto,L“%02X”,cmd2);
wsprintf(szTextt,L“68 a1 04 %s %s”,szText1,szTexto);
wcstombs_s (&siz, szAnsi, sizeof (szAnsi), szTextt, _TRUNCATE);
for(int i=0,j=0;i<64,j
評論
0
0
載入更多
看下了程式,應該是沒什麼問題的,雖然波特率設定成4800後,在時鐘12mhz情況下有3%誤差,但不至於影響通訊,尤其只是做實驗的前提下。如果使用串列埠除錯助手除錯,檢查一下波特是否設定為4800,資料格式是否為8-n-1,即無校驗位,8位資料和1位停止位。看看除錯助手是否勾選了自動清除功能。同時可以檢視rx和tx計數,如果這兩個數字都不是0,證明串列埠收發正常,只是資料沒被隱藏了。另外需要檢查串列埠電纜是否損壞。