多个下位单片机与上位机pc通过串口通信的实现
最好给个程序非常感谢至于串口通信就不用单独给程序了我现在实现了一个能正常传输数据了我想用上位机采集两个单片机传来的数据希望能明白我的意思最好是c语言的非常感谢就是利用23...
最好给个程序 非常感谢 至于串口通信就不用单独给程序了 我现在实现了一个能正常传输数据了 我想用上位机采集两个单片机传来的数据 希望能明白我的意思 最好是c语言的 非常感谢
就是利用232转485电路 但是我想问问 上位机如何判断是下位机哪个传递的数据 给个简单的程序好吗 谢谢 展开
就是利用232转485电路 但是我想问问 上位机如何判断是下位机哪个传递的数据 给个简单的程序好吗 谢谢 展开
展开全部
用PC机与多个51单片机通过RS232进行通讯。
在多机通讯中,要保证主机与所选择的从机实现可靠的通信,必须保证串口具有识别的功能。在串行口控制寄存器SCON中有一位叫做SM2,就是为了多机通讯而设置的控制位。多机通讯的过程可以如下:
1 首先从机初始化,开中断,让其以方式2或3接收(9位异步通讯方式),置位SM2,REN位,允许接收,那么当SM2=1的时候,只有当接收到的第9位数据(RB8)等于1(接收到的为地址帧)的时候,前8位数据送入接收SBUF,置位RI,产生中断。如果接收到的第9位数据位0,则将接收到的数据帧丢弃。
2 此时主机可以先将从机地址发送给各个从机系统,各个从机的串口接收到第9位数据RB8为1,由于SM2=1,置位RI,各个从机相应中断,在中断服务程序中判断主机送来的地址是否与本机地址相符合(这个地址是由软件编写人员自行设定的),若相符,则清零SM2,准备接收数据。若不符,则保持SM2=1.
3 第三步主机开始发送数据帧,此时前面地址相符合的从机,SM2=0,主机发送的数据RB8=0,这样只有SM2=0的相符的从机可以产生接收数据中断,激活中断标志位RI,进入中断服务程序,去接收数据。其他的从机因SM2=1,又RB8=0,不能激活中断标志RI,不能进入中断,则把接收到的数据丢失不做处理。从而保证了这个数据通信的正确性。
程序详见参考资料
在多机通讯中,要保证主机与所选择的从机实现可靠的通信,必须保证串口具有识别的功能。在串行口控制寄存器SCON中有一位叫做SM2,就是为了多机通讯而设置的控制位。多机通讯的过程可以如下:
1 首先从机初始化,开中断,让其以方式2或3接收(9位异步通讯方式),置位SM2,REN位,允许接收,那么当SM2=1的时候,只有当接收到的第9位数据(RB8)等于1(接收到的为地址帧)的时候,前8位数据送入接收SBUF,置位RI,产生中断。如果接收到的第9位数据位0,则将接收到的数据帧丢弃。
2 此时主机可以先将从机地址发送给各个从机系统,各个从机的串口接收到第9位数据RB8为1,由于SM2=1,置位RI,各个从机相应中断,在中断服务程序中判断主机送来的地址是否与本机地址相符合(这个地址是由软件编写人员自行设定的),若相符,则清零SM2,准备接收数据。若不符,则保持SM2=1.
3 第三步主机开始发送数据帧,此时前面地址相符合的从机,SM2=0,主机发送的数据RB8=0,这样只有SM2=0的相符的从机可以产生接收数据中断,激活中断标志位RI,进入中断服务程序,去接收数据。其他的从机因SM2=1,又RB8=0,不能激活中断标志RI,不能进入中断,则把接收到的数据丢失不做处理。从而保证了这个数据通信的正确性。
程序详见参考资料
参考资料: http://blog.csdn.net/joyzml/archive/2009/09/28/4603797.aspx
展开全部
有两个串口的话,设定对应的串口工作模式就行了。一个串口采两个单片机的信号比较麻烦。采取分时复用的方式可以处理。以上位机做主机,其它单片机做从机。每个单片机的地址码不相同。主机发送命令要求其中一台单片机回复时,该单片机回复,另一台则等待。当访问另一台时,这一台等待。记住,同一时候三者只有一个在发送。其它两个都在等待。上位机为主机。发送完以后,要等待回应或过一个固定的时间再访问另一台。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是一个单片机具有多个串口,那么中断和地址是不同的,通信程序中更改下地址和中断就好了.
如果单片机只有一个串口,那就要更改硬件电路了,串口是1对1的,不支持1对多.
422和485可以支持1对多.
给每一个下位机编写一个不同的地址码,放入一个寄存器中,每次上传给上位机数据的时候,把地址码包含在数据包中,收到有效数据后,就可以根据地址码确认了,相当于身份ID.
如果不想在程序中修改,也可以通过拨码开关,在外部拨到地址位,每次上电后,通过读取拨码开关的值来确定自己的身份ID.
上位机向下位机发送数据的时候,如果是向单个发送的,就在数据包增加要发送下位机的地址码,如果是要向全部发送,就把地址码设为一特殊值,当作广播下发.
这个要在上下位机通讯协议中明确出来.
如果单片机只有一个串口,那就要更改硬件电路了,串口是1对1的,不支持1对多.
422和485可以支持1对多.
给每一个下位机编写一个不同的地址码,放入一个寄存器中,每次上传给上位机数据的时候,把地址码包含在数据包中,收到有效数据后,就可以根据地址码确认了,相当于身份ID.
如果不想在程序中修改,也可以通过拨码开关,在外部拨到地址位,每次上电后,通过读取拨码开关的值来确定自己的身份ID.
上位机向下位机发送数据的时候,如果是向单个发送的,就在数据包增加要发送下位机的地址码,如果是要向全部发送,就把地址码设为一特殊值,当作广播下发.
这个要在上下位机通讯协议中明确出来.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询