串口和单片机通信的问题
单片机内数据处理是16进制的形式,例如PC发送给单片机一组数据:
A5 5A 01 01 FF
单片机回复一组16进数: 67 76 01 00 02 03 00 00 00 00
现在知道数据的长度。PC机收发数据呢?我看了龚建伟的文章,还是搞不懂啊!
例如他做的收的部分:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}
每收到一个字符就触发一个OnComm()事件,那么为什么还要计算得到的数据长度呢?
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
这个之后,是不是rxdata里头保存的就是收到的16进制数了?
那这样之后,是不是把里头的数据直接转换成ASC码再显示呢?
请回答我的疑惑,或者帮我写个代码也行啊!
PC发给单片机的数据是: A5 5A 01 01 FF,其实A5 5A是包头,01是单片机地址,后一个01是命令,FF是异或和校验
单片机发给PC的是:67 76 01 。。。FF,67和76是包头,01是地址,。。。号部分是6个字节的16进制数,分别是5字节温度数据和1字节开关状态数据,FF是校验和。