線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2523
推到 Plurk!
推到 Facebook!

RS232 收 Code 會漏資料 !!

答題得分者是:李國維
carloyan
一般會員


發表:35
回覆:14
積分:9
註冊:2004-05-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-30 18:48:49 IP:61.56.xxx.xxx 未訂閱
有嘗試著放在 Timer 或是 Thread 之下收資料,可是依然會漏掉一些 Code,而且還很頻繁柳 ! 氣西郎 ~~~

小弟的 Code 如下 : void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *ComNo;
DCB dcb;
String Temp; //取得欲開啟的通訊埠
Temp = "\\\\.\\COM" IntToStr(RzSpinEdit1->IntValue); //轉換至指標型態
Char ComNo = Temp.c_str();
hComm = CreateFile(ComNo,GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, 0, NULL);

if (hComm == INVALID_HANDLE_VALUE) // 如果COM 未開啟
{
MessageBox(0, "Open COM Port Error !!!","Comm Error",MB_OK);
return;
}

ZeroMemory(&dcb, sizeof(dcb));
dcb.DCBlength = sizeof(dcb); //將dcb位址傳入,以取得通訊參數
GetCommState(hComm,&dcb); // 得知目前COM 的狀態
dcb.BaudRate = CBR_9600; // 設定鮑率為9600
dcb.ByteSize = 8; // 位元組為 8 bit
dcb.Parity = NOPARITY; // Parity 為 None
dcb.StopBits = ONESTOPBIT; // 1 個Stop bit

//通訊埠設定
if (!SetCommState(hComm, &dcb)) // 設定COM 的狀態
{
MessageBox (0, "Comport Set Error !!!","Set Error",MB_OK);
CloseHandle(hComm);
return;
}
}

//// 收CODE 判別資料區
String Temp;
char inbuff[1];
DWORD nBytesRead, dwEvent, dwError;
COMSTAT cs;
int cVKDown = 0, cVKUp = 0;
if (hComm == INVALID_HANDLE_VALUE) return; //取得狀態
ClearCommError(hComm,&dwError,&cs); // 資料是否大於我們所準備的Buffer

if (cs.cbInQue > sizeof(inbuff))
{
PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 資料
return;
}

ReadFile(hComm, inbuff,cs.cbInQue,&nBytesRead,NULL); // 接收COM 的資料

//轉移資料到變數中
inbuff[cs.cbInQue]= '\0';
switch (inbuff[0])
{
case ScanCode_1: //1
{ ..... }
case ScanCode_2: //2
{ ..... }
default: { break; } }
編輯記錄
carloyan 重新編輯於 2008-01-30 16:07:58, 註解 無‧
carloyan 重新編輯於 2008-01-30 16:13:42, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-30 23:53:15 IP:218.168.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-31 02:01:31 IP:218.167.xxx.xxx 未訂閱
carloyan: 你所謂的漏掉一些Code我不是很清楚.我看你一次才接收一各char的資料.只要大於一各char的資料,你都清空了.會不會是這裡出問題. 基本上RS232要掉CODE一定是程式判斷出了問題.並且我很少發現到COMMAND只有一各CODE的儀器.所以建議你可以試著在接收資料後把接收的資料顯示出來.看看是不是正常.是的話在進行處理.如不是.你可先試著接收多一點的資料.作顯示在看看資料是否正常.
carloyan
一般會員


發表:35
回覆:14
積分:9
註冊:2004-05-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-02 09:25:38 IP:61.56.xxx.xxx 未訂閱
李先生 ~ 謝謝你的建議 ! 目前我將資料長度判別式給 Mark 了,暫時不用 ! 也將接收資料長度改成128個位元試試看 ! Try 了一陣子還沒有看到明顯的狀況 ! 有改善一些 ! 謝謝囉 !
系統時間:2024-04-27 4:15:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!