Delphi Spcomm 串口通訊 為啥只能接受一條資料?
問題描述:
下位機 51單片機 發送一段中文字串, 用串口除錯助手程式(上位機程式),能看到一行行的中文不停的采集到
證明:51單片機的串口程式正常,pc串口通訊也正常
我的delphi程式:
procedure SpCommInit(); //com3 波特率 資料位啥的都設定的和串口除錯助手一樣的
begin
form1.Comm1.CommName:='COM3';
form1.Comm1.BaudRate:=4800;
form1.Comm1.Parity:=None;
form1.Comm1.ByteSize:=_8;
form1.Comm1.StopBits:=_1;
form1.comm1.ReadIntervalTimeout:=100;
form1.Comm1.StartComm;
// form1.Comm1.Inx_XonXoffFlow := False;
// form1.Comm1.Outx_XonXoffFlow := False;
end;
procedure TForm1.BitBtn1Click(Sender: TObject); //設定一個連接Com 的按鈕, 按下 即連接Com3 按鈕自動失效
begin
SpCommInit();
form1.BitBtn1.Enabled:=false;
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; //Comm1ReceiveData事件 獲取下位機上傳的數 // 據,并追加到Memo中
BufferLength: Word);
var
receivedata:array of byte;
str:string;
begin
// sleep(100);//等待100ms,保證接收到所有資料
SetLength(str,BufferLength);
move(Buffer^,pchar(@str[1])^,BufferLength); //從緩沖區將資料拷貝出來
form1.Memo1.Lines.Add(str);
end;
////////////////現在的問題是,我一按下按鈕后,Memo有時會顯示一整條下位機傳上來的完整字串,有時是半條不完整的字串
///有時干脆不顯示
///但是要命的是 Comm1ReceiveData事件 只觸發了一次,就啥也沒有了,單片機還在不停的上傳資料, 可是就是看不到觸發事件產生的Memo中的任何變化,希望諸位大俠給予解決啊
uj5u.com熱心網友回復:
用 虛擬串口 模擬了一對串口,然后打開一個串口(COM2)寫入資料,程式打開COM1接收,你的代碼正常運行。你可以用 portMon這個工具,監控下設備是不是正常發送資料。
uj5u.com熱心網友回復:
form1.comm1.ReadIntervalTimeout:=100;把這一行注釋掉
uj5u.com熱心網友回復:
確保設備通信正常;ReadIntervalTimeout設大點uj5u.com熱心網友回復:
sleep(100),100改成200,300,400試試最好不用.Comm1ReceiveData()事件接收,自己開個執行緒手工讀資料,可以判斷緩沖區接收的資料(比如資料長度,幀標志等),然后讀
uj5u.com熱心網友回復:
根據有限的經驗,跟你交流一下:begin
// sleep(100);//等待100ms,保證接收到所有資料=======這一句切記不要用
SetLength(str,BufferLength);===========
move(Buffer^,pchar(@str[1])^,BufferLength); //從緩沖區將資料拷貝出來
form1.Memo1.Lines.Add(str);===========以上三行,不應該在事件中出現,你應該撰寫一個程序或函式,將緩沖區傳送過去便可,在觸發事件中寫這種型別的代碼,極容易造成你現在的這種效果
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42809.html
標籤:VCL組件開發及應用
