我采用victor控制元件從驅動器(下位機)接收資料,然后把資料畫成波形,因為資料回傳的資料很快,現在victor不能接受到下位機的資料,前面有速度不快的指令,收發是正常的,但是后面的資料速度很快,一直收不到,我最開始是在一個執行緒里面接收的,但是不可以,后面我改成在一個定時器里面,每隔5ms從緩沖里面讀取一次,但是仍然不可以,下位機每幀資料是十個位元組的資料。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
上面一個地方打錯了,每幀資料是八個位元組uj5u.com熱心網友回復:
求幫助謝謝大家uj5u.com熱心網友回復:
1.接收資料建議在控制元件的1 OnPackage 事件里寫。2.對方發來的資料即使是一次發一幀、八個位元組,但在接收時,也可能會出現接收到不完整的一幀的情況,所以你在處理時,要對剩余資料不足一幀的情況進行處理。
uj5u.com熱心網友回復:
OnPackage 事件有時間間隔,我資料發的很快,OnPackage 基本是進不去的uj5u.com熱心網友回復:
我現在改用了TComm控制元件,請問八位元組的16進制資料接收應該怎么寫呢?uj5u.com熱心網友回復:
直接按字串讀進來,再決議uj5u.com熱心網友回復:
請問這么寫有什么錯誤?
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
unsigned char buf[8] ={0};
AnsiString str;
int count=MSComm1->InBufferCount; //位元組數;
OleVariant rec = MSComm1->Input; //取出接識訓沖器內容;
char m = rec.GetElement(count-1);//測驗發現這一句不對
for(int j=0;j<count; j = j+8)
{
for(int m =0;m<8;m++)
{
if(8*j+m>=count)
break;
buf[m] = rec.GetElement(j*8+m); //轉換成位元組型別
}
}
}
測驗的那一句發現有錯,我在回圈里面加一個static變數,也發現回圈的次數小于位元組數count
uj5u.com熱心網友回復:
以前是這么用的,供參考
int buff[200];//宣告一個存盤接收資料的緩沖區,全域變數
int ByteNum;//收到的位元組數
int BuffPtr;//接識訓沖區的指標,請宣告為全域變數,
OleVariant RxBuff;//一個用于接收的OleVariant變數。
if(MSComm1-> InBuffCount>0)RxBuff=Communica1->Input;//如果緩沖區有多于一個位元組的資料
ByteNum=RxBuff.ArrayHighBound(1);//將實際讀的位元組數取出
for(int i=0;i<=ByteNum;i++)
{
buff[BuffPtr++]=RxBuff.GetElement(i);//將接收資料讀入自己的緩沖區。
}
uj5u.com熱心網友回復:
這樣的資料利用控制元件自動決議資料包的方法不適用,需要自己按照通訊協議決議資料,換哪個控制元件都一樣轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45910.html
