我用VB做为上位机通过串口发送一组数据给51单片机,让单片机去控制其他设备,遇到如下问题:
VB的发送程序如下:
Private Sub Command3_Click()
Dim echoch
Dim kz(9) As Byte
If Text7.Text <> "" Then
echoch = Text7.Text
kz(0) = &H3
kz(1) = echoch
MSComm1.Output = kz
End If
Label22.Caption = echoch
End Sub
单片机的接收程序如下:
void serial () interrupt 4 using 3
{ uchar a;
a=0;
RI=0;
str[a++] =SBUF;
mc=str[0];
n=str[1];
}
遇到问题如下:
1、接收时每次都是str[0]=SBUF,不能使n=str[1],即总是将数据赋值给str[0],str[0]不断更新。而我是想将发送的第一个数据给str[0],第二个数据给str[1],这个问题该如何解决?
2、 Text7.Text中输入7,那么我想在单片机上,用7参与运算,但是串口发送时,会有数据类型转换,那么如何使n=str[1]后,把n的值转换成可以参加运算的数字7
Text7.Text中输入7是举个例子,Text7.Text输入任何数值,都要转化成能够参与运算的数字
单片机的接收程序作了如下改动,但还是不行
void serial() interrupt 4 using 3
{
uchar a = 0;
if(RI)
{
RI=0;
str3[a++]=SBUF;
}
mc=str[0];
n=str[1];
}
用了你的方法,上位机发送数据,单片机就没有反应了。
Text7.Text中输入7是举个例子,我想Text7.Text输入任何数值,都要转化成能够参与运算的数字,该如何解决呢?
将你单片机的程序改为如下:
void serial () interrupt 4
{
uchar a;
RI=0;
str[a] =SBUF;
a++;
mc=str[0];
n=str[1];
}
你的上位机
Dim kz(9) As Byte
。。。
kz(0) = &H3
kz(1) = echoch
MSComm1.Output = kz
。。。
似乎有点问题。
用了您的方法,还是出现上述问题。
Text7.Text中输入7是举个例子,Text7.Text输入任何数字,都要转化成能够参与运算的数字,该如何解决呢?
你打算使用多少个str[ ],就两个? 0 1 还是一直填充直到数组填满?
都说static 下a会一直增加,每收一个字节都会加1并保持,所以要考虑当前收到的SBU要放str[]位置。
你上位机不管充文件里读到什么,只要是用asc码方式发送下去,那么单片机收到的一定是字符‘7’。字符‘7’ -字符‘0’ 就过就转换称数字7 , 如果这个你都搞明白就自己去查ascII表去。
你单片机如何定位输入的数据?即收到上位机发的东西后如何确定要放到str[]的哪个位置?或者你读str[]的时候如何知道上位机的意图?简单的自定义协议总有吧?要不收到的数据放str[0]或者 str[1]乱了怎么办?