代碼是網上找的,如下:
1.定義變數
bool ComState = FALSE; //串口狀態
HANDLE hCom = 0; //串口打開回傳值
DCB dcb;
OVERLAPPED OverRead, OverWrite;
COMSTAT comstat;
OVERLAPPED os;
DWORD dwEvtMask=0;
String dat;
HANDLE m_pThread;
COMMTIMEOUTS ComTimeouts;
char ReadBuff[1024]; //讀緩沖區
DWORD ReadCount; //讀位元組數
2.串口初始化
void __fastcall TForm1::btn1ClickSerialPortInit(TObject *Sender)
{
if(FALSE == ComState)
{
hCom=CreateFile( "COM3", //檔案名
GENERIC_READ|GENERIC_WRITE,//訪問模式允許讀寫
0, //此項必須是0
NULL,//無安全引數
OPEN_EXISTING,//創建方式
// FILE_FLAG_OVERLAPPED,//異步作業方式
0,
NULL);
if (hCom==INVALID_HANDLE_VALUE)
{
ShowMessage("Can not open the port !");
CloseHandle(hCom);
hCom = 0;
}
if(!GetCommState(hCom,&dcb)) //獲得串口設定并用它填充dcb結構體
{
ShowMessage("GetCommState failed");
}
if (!SetupComm(hCom,1024,1024)) //設定輸入輸出緩沖區大小
{
ShowMessage("SetupComm failed");
}
// 設定接收超時限定
ComTimeouts.ReadIntervalTimeout = MAXDWORD;
ComTimeouts.ReadTotalTimeoutMultiplier = MAXDWORD;
ComTimeouts.ReadTotalTimeoutConstant = 1000;
SetCommTimeouts(hCom,&ComTimeouts);
//設定dcb結構成員變數
dcb.BaudRate=115200;
dcb.fParity=0;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
dcb.ByteSize=8;
dcb.fNull=FALSE;
if(!SetCommState(hCom,&dcb)) //重新配置串口
{
ShowMessage("SetCommState failed");
}
//清空串口緩沖區,退出所有相關操作
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
Form1->Caption=comname+" 通信成功!";
ComState = TRUE;
btn1->SetTextBuf("關閉串口");
}
else
{
CloseHandle(hCom);
ComState = FALSE;
btn1->SetTextBuf("打開串口");
}
}
2.發送函式
void __fastcall TForm1::btn2ClickSendData(TObject *Sender)
{
//發送資料
BOOL WriteState;
unsigned long Written ;
DWORD dwError;
int Size = EditSndData->GetTextLen(); //Get length of string in Edit1
char *p = new char[Size]; //Creates Buffer dynamic variable
//分配記憶體,必須有,要不然程式會出現錯誤
EditSndData->GetTextBuf(p,Size);
WriteState = WriteFile(hCom,//用CreateFile 獲得的檔案句柄
p,//輸出緩沖區首址
Size,//要求輸出的位元組數
&Written,//實際輸出位元組數
&OverWrite);//重疊操作方式資料結構地址
if (WriteState && GetLastError()== ERROR_IO_PENDING )
{
ShowMessage("Error !!!");
}
}
3.接收資料(定時查詢接收)
void __fastcall TForm1::tmr1TimerReceiveData(TObject *Sender)
{
//TODO: Add your source code here
DWORD nBytesRead, dwEvent, dwError;
COMSTAT cs; // 用于存放串口狀態
if(hCom==INVALID_HANDLE_VALUE) return;
ClearCommError(hCom,&dwError,&cs);
if(cs.cbInQue>sizeof(ReadBuff))
{
PurgeComm(hCom, PURGE_RXCLEAR);
return;
} // 資料多于緩沖區?是:接收資料無效,清除
ReadFile (hCom, ReadBuff, cs.cbInQue, &nBytesRead,
NULL); // 讀取接收資料
ReadBuff[cs.cbInQue] = '\0';
if(cs.cbInQue > 0)
{
EditRcvData->Text = ReadBuff; // 將資料顯示出來
}
}
上述代碼在bcb6,win7下編譯,發現有3個問題
1、接收的資料存在丟幀現象。用串口助手每次都接收到76條,用該軟體收到60左右。(有時是59,有時是60,有時是61)
2、初始化串口后,點發送按鈕后報錯 依次為“Can not open the port”“GetCommState failed”"SetupComm failed" "GetCommState failed"
3、把發送代碼合并到到 btn1ClickSerialPortInit(TObject *Sender) 里面,不報錯,但也沒有發送。
請哪位朋友知道是什么原因?如果誰有bcb 6 win7 能運行的 基于API的串口 收發程式,也請發我一份參考,[email protected] 謝謝。
uj5u.com熱心網友回復:
ReadFile (hCom, ReadBuff, cs.cbInQue, &nBytesRead,NULL); // 讀取接收資料
ReadBuff[cs.cbInQue] = '\0';
if(cs.cbInQue > 0)
{
EditRcvData->Text = ReadBuff; // 將資料顯示出來
}
這么處理是不是不合理?如果在資料中遇到空字符(非空格),這樣直接就斷開了。
uj5u.com熱心網友回復:
CreateFile 第一個引數 傳一個指標試一下。if (hCom==INVALID_HANDLE_VALUE)
{
ShowMessage("Can not open the port !");
//CloseHandle(hCom); //打開失敗,無效指標
hCom = 0;
return; //打開串口失敗,就直接退出,繼續往下 也是報更多錯
}
uj5u.com熱心網友回復:
1、在呼叫GetCommState之前,對傳入的結構體成員DCBlength做一個初始化。 dcb.DCBlength = sizeof(dcb);這樣試試。2、關于丟幀現象,你創建埠句柄的時候沒有使用重疊方式。
hCom=CreateFile( "COM3", //檔案名
GENERIC_READ|GENERIC_WRITE,//訪問模式允許讀寫
0, //此項必須是0
NULL,//無安全引數
OPEN_EXISTING,//創建方式
// FILE_FLAG_OVERLAPPED,//異步作業方式
0,
NULL);
但是在發送資料的時候卻用了重疊方式。
WriteState = WriteFile(hCom,//用CreateFile 獲得的檔案句柄
p,//輸出緩沖區首址
Size,//要求輸出的位元組數
&Written,//實際輸出位元組數
&OverWrite);//重疊操作方式資料結構地址
不過我不清楚這樣有沒有使用問題 :D,沒試過。
另外,char *p = new char[Size]; 這個資料分配了記憶體也沒有釋放。
另外,不知道發送的資料量大不大,頻率怎么樣,還有定時器里的周期是多少。
如果資料量比較頻率,可以采用執行緒接收一下。
下面這代碼去掉看看。
//----------------------------------------------------------------
ClearCommError(hCom,&dwError,&cs);
if(cs.cbInQue>sizeof(ReadBuff))
{
PurgeComm(hCom, PURGE_RXCLEAR);
return;
} // 資料多于緩沖區?是:接收資料無效,清除
//---------------------------------------------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/34067.html
上一篇:c++實驗
下一篇:系統設計與開發
