用VC++6.0實現PC機與單片機之間的數據交換
2. 通信程序設計
部分上位機程序
?。?)發(fā)送命令字程序,代碼如下
void CCommDlg::OnSend()
{
CSerial Serial;
//構造串口類,初始化串行口
if (Serial.Open(2,9600)) //if-1
//打開串行口2,波特率為9600bps
{
static char szMessage[]="0";
//命令碼(可定義各種命令碼)
int nBytesSent;
int count=0;
resend:
nBytesSent=Serial.SendData(szMessage,strlen(szMessage));
//發(fā)送命令碼
char rdMessage [20];
if (Serial.ReadDataWaiting()) //if-2
{
Serial.ReadData(rdMessage,88);
//rdMessage 定義接收字節(jié)存儲區(qū),為全局變量//
if ((rdMessage[0]!=0x7f)(count3))
{
count++;
goto resend
}
if(count>=3)
MessageBox(“發(fā)送命令字失敗”);
}
else //if-2
MessageBox("接收數據錯誤");
}
else //if-1
MessageBox("串行口打開失敗");
}
下位機通信程序:
#includereg51.h>
#includestdlib.h>
#includestdio.h>
#define count 9
#define com_code 0x00
#define com_code1 0xff
unsigned char buffer[count];
int po,year,month,date,hour;
int minute,second,recordID ;
int sum;
main()
{
…
/*初始化串口和定時器*/
TMOD=0×20;
TH1=0×fd;
TR1=0×01;
ET1=0×00;
ES=1;
EA=1;
/*待發(fā)送數據送緩沖區(qū)*/
buffer[0] = 0×ff; //數據特征碼
buffer[1] = count+1; //數據長度
buffer[2] = year; //年
buffer[3] = month; //月
buffer[4] = date; //日
buffer[5] = hour; //時
buffer[6] = minute; //分
buffer[7] = second; //秒
buffer[8] = recordID; //事件號
for(po=0;pocount;po++)
sum+=buffer[po];
buffer[9]=sum; //校驗和
…
}
/*發(fā)送中斷服務程序*/
void send(void) interrupt 4 using 1
{
int i;
RI=0;
EA=0;
do
{
for(i=0;i=count;i++)
{
SBUF=buffer[i]; //發(fā)送數據和校驗和//
while(TI==0);
TI=0;
}
while(RI==0);
RI=0;
} while(SBUF!=0); //主機接收不正確,重新發(fā)送//
EA=1;
Return;
}
5 應用總結
根據不同需要,選擇合適的方法。我們選用的用VC++類實現的上位機和下位機的串行通信方法具有使用簡單、編寫程序方便的特點。經過半年多應用于EBM滅火系統(tǒng)的情況來看,該方法實現的系統(tǒng)運行穩(wěn)定可靠,是一種值得推廣的簡單易行的通信方法。
c語言相關文章:c語言教程
單片機相關文章:單片機教程
c++相關文章:c++教程
單片機相關文章:單片機視頻教程
單片機相關文章:單片機工作原理
評論