单片机和PC串口通信问题

zdwirvin 2008-04-17 11:08:02
我用单片机给PC串口发送数据,代码如下:
void main(void)
{
unsigned char i,j;
serial_init();
while(1)
{
SBUF=JD_Head; //JD_Head是JD[]的引导码,收到JD_Head之后表明下面的数据是JD[]
delay(100);
for(i=0;i<10;i++)
{
SBUF=JD[i];
delay(100);
}
SBUF=WD_Head; //同上,WD_Head为WD[]的引导码
delay(100);
for(j=0;j<9;j++)
{
SBUF=WD[j];
delay(100);
}
}
}
单片机串口波特率为9600bps

VB6.0里的代码:

Const JD_Head As Byte = 170
Const WD_Head As Byte = 85
Dim JDTemp(10) As Byte
Dim WDTemp(9) As Byte
Public Jingdu_D As Byte
Public Jingdu_F As Single
Public Weidu_D As Byte
Public Weidu_F As Single

Private Sub Form_Load()
MSComm1.InBufferSize = 40 '初始化串口
MSComm1.InBufferCount = 0
MSComm1.InputMode = comInputModeBinary '二进制方式
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.RThreshold = 1
MSComm1.InputLen = 0 '每次读入缓冲区所有字符
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True '打开串口
End If
End Sub

Private Sub MSComm1_OnComm()
Dim FrameTemp As Variant
Dim ByteTemp() As Byte
Dim i As Integer
If MSComm1.CommEvent = comEvReceive Then

FrameTemp = MSComm1.Input
ByteTemp = FrameTemp

If NextData = 1 Then
If (i < 10) Then
JDTemp(i) = ByteTemp(0)
i = i + 1
Else:
i = 0
NextData = 0
Jingdu_D = JDTemp(0) * 100 + JDTemp(1) * 10 + JDTemp(2)
Jingdu_F = JDTemp(3) * 10 + JDTemp(4) + JDTemp(6) * 0.1 + JDTemp(7) * 0.01 + JDTemp(8) * 0.001 + JDTemp(9) * 0.0001
Label1.Caption = Jingdu_D & "度" & Jingdu_F & "分"
End If
End If

If NextData = 2 Then
If (i < 9) Then
WDTemp(i) = ByteTemp(0)
i = i + 1
Else:
i = 0
NextData = 0
Weidu_D = WDTemp(0) * 10 + WDTemp(1)
Weidu_F = WDTemp(3) * 10 + WDTemp(4) + WDTemp(6) * 0.1 + WDTemp(7) * 0.01 + WDTemp(8) * 0.001 + WDTemp(9) * 0.0001
Label2.Caption = Weidu_D & "度" & Weidu_F & "分"
End If
End If

If ByteTemp(0) = JD_Head Then '下标越届,若去掉(0),则为类型不匹配
NextData = 1
'Label1.Caption = JD_Head '调试所用。可以显示JD_Head 的内容,表明可以收到JD_Head
End If
If ByteTemp(0) = WD_Head Then
NextData = 2
'Label2.Caption = WD_Head '调试所用。可以显示WD_Head 的内容,表明可以收到WD_Head
End If
End If
MSComm1.InBufferCount = 0
End Sub

流程就是单片机发送char型的数据JD[10],WD[9],在发JD[]前先发JD_Head进行同步,在发WD[]前先发WD_Head同步
PC接收并存储于JDTemp[10]和WDTemp[9]中
现在还存在的问题标明在注释中了,问题不定,一会这个,一会那个。JD_Head和WD_Head都可以正确接收,问题可能在JD[]和WD[]的接收存储中。请高人指点。
...全文
273 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
以后需再关注,现在先帮你顶一下
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
接分先!
zdingyun 2008-04-18
  • 打赏
  • 举报
回复
从你叙述看,你是以ByteTemp(0)来判断首字节,然后进行数据接收处理。这样会产生
问题,MSComm控件的OnComm事件当你设置MSComm1.RThreshold = 1时,接收缓冲区到达1至8字节仅产生1次OnComm事件,在需接收数据字节为9时则产生2次 OnComm事件
而且ByteTemp(0)为第9字节内容,这会导致接收错误。
所以请用文字仔细叙述你上下位机的通信协议,才能便于提供意见。

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧