求教,怎麼設定串列埠通訊中的定時傳送 匿名使用者 1級 2016-12-23 回答

裝置與微控制器串列埠通訊程式,寫了兩個執行緒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

載入更多

求教,怎麼設定串列埠通訊中的定時傳送 捕獵者 1級 2016-12-23 回答

看下了程式,應該是沒什麼問題的,雖然波特率設定成4800後,在時鐘12mhz情況下有3%誤差,但不至於影響通訊,尤其只是做實驗的前提下。如果使用串列埠除錯助手除錯,檢查一下波特是否設定為4800,資料格式是否為8-n-1,即無校驗位,8位資料和1位停止位。看看除錯助手是否勾選了自動清除功能。同時可以檢視rx和tx計數,如果這兩個數字都不是0,證明串列埠收發正常,只是資料沒被隱藏了。另外需要檢查串列埠電纜是否損壞。