一直是編底層、下位機程式的,學習C++ Builder的串口編程。用的MScomm串口控制元件發送訊息,如下:
//---------------------------------------------------------------------------
void __fastcall TForm1::Btn_SendClick(TObject *Sender) //按鈕發送
{
int i;
int iSendCnt; //發送包的位元組數
OleVariant send;
//AnsiString str;
// char *buff;
int pc_send[5] = {0x01,0x31,0x00,0x35,0x9B}; //PC發出的資料包
send = VarArrayCreate(OPENARRAY(int, (0, 5-1)), varByte); //創建一個動態陣列
for(i = 0; i < 5; i++)
{
send.PutElement(pc_send[i], i); //填充待發送的資料元素
}
MSComm1->Output = send;//從串口發送
}
1、這個程式是可以發送的,但是有個問題:如果pc_send[5]數值中有0x00,下位機接什么回什么,回傳顯
示0x00沒有了,不知道是上位機沒發出去,還是下位機沒接收到?
2、另外,只要pc_send[5]陣列元素都是>0的,都可以正常回傳,用其它串口軟體測驗下位機,也是正常的。
由此判斷,上位機沒發出去!!難道“send.PutElement(pc_send[i], i); //填充待發送的資料元素”,這個有問題?
uj5u.com熱心網友回復:
做串口通訊程式,建議你安裝一個Eltima出品Serial Port Monitor,用來監控和模擬串口收發資料。觀察一下上位機發出的資料到底是不是你預期的,然后再分析。uj5u.com熱心網友回復:
我用串口MSCOMM 編過小專案,是用事件讀取的void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{ // 串口采用異步通迅,不同的埠可同時按收----------------------------------------
TMSComm *mscomm1=(TMSComm *)Sender;
int port=mscomm1->CommPort;
TChannel * c=Channels[port];
OleVariant buf0=mscomm1->Input;
if (!c->isIdle)
{
BYTE *buf1=c->buf;
int cn=buf0.ArrayHighBound()+1;
for (int i=0;i<cn;i++)
buf1[c->bufLen++]=buf0.GetElement(i);
if (c->chCount!=0 && c->bufLen>=c->chCount)
{ // 置點的狀態
c->bufLen=c->chCount;
Points[c->pointIdx]->dataStat=3; // 完成,可以處理了
Points[c->pointIdx]->dataLen=c->bufLen;
Points[c->pointIdx]->dataTick1=GetTickCount();
c->isIdle=true; // 釋放通道
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/47583.html
標籤:網絡及通訊開發
