ros与单片机串口通讯讯发送和接收在一根线,程序怎么写

51单片机与移位寄存器串口通讯程序怎么写
51单片机与移位寄存器串口通讯程序怎么写
09-09-26 &匿名提问
一、串行通讯的基本原理所谓&串行通信&是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。相比之下,由于高速率的要求,处于计算机内部的CPU与串口之间的通讯仍然采用并行的通讯方式,所以串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。  二、串口通讯的程序设计原理  前面介绍了串行通讯的基本原理,那么如何在程序设计中实现它呢?事实上,这个过程并不复杂,一般有两种实现途径:其一就是使用MSCOMM控件,此控件提供很多方便操作的属性和方法,利用它们可以很方便地实现你的目的;另外一种途径就是使用Windows API,微软为开发者提供了很多相关的串行操作的编程接口,使用这些接口,可以很完成更为强大的功能。限于篇幅以及本文的宗旨,这里着重介绍第一种方法,第二种方法实际思路与第一种方法一样,不同的是它利用API函数代替了控件。  无论使用哪一种途径,其基本的操作步骤大致一样的:首先初始化串口,比如端口号,波特率等属性,然后打开端口,通过接受缓冲区读上行数据,通过发送缓冲区来写下行数据。最后通过事件驱动来反映数据的到达与发送过程,另外在通讯过程中的错误的产生也可以通过CommEvent属性来管理。  三、VB平台下的实现  使用MSCOMM控件主要是通过事件来处理串行口的交互,即当数据到达时,控件的OnComm的事件就会来捕获或处理这些通讯事件。而OnComm事件也可以用来捕获和处理通讯错误。在实际应用中,一个MSCOMM控件就对应一个串行口,所以如果要处理多个串行口的话,必须有相应数量的控件与之对应。下面介绍一下此控件的主要属性:  CommPort---------设置或者返回串行端口号  Settings-------------用来设置和返回波特率,奇偶校验,数据位和结束位  PortOpen----------设置或者返回通讯端口的状态,也可以打开和关闭一个端口  Input----------------从接受缓冲区里获取或删除数据  Output-------------给发送缓冲区里写数据  另外对于OnComm事件来说,每当CommEvent的数值发生改变时就会产生这种事件,这就表明要么就是一个通讯事件的产生,要么是一个通讯错误产生。CommEvent属性里面包含了通讯事件或者产生的错误的编号。那么为了能够更加清楚的说明上述问题,下面给出一个例程,例程要实现的功能很简单,就是在一个过程里给一个特定的串行口发送数据,然后在另外一个过程里实时检测此串行口以便一旦此串行口的发送缓冲区有数据就显示消息,如果发送空数据就会显示&无数据的字样&。主要核心代码如下:Private Sub Command1_Click()If Text1.Text = && ThenList1.AddItem &发送缓冲区无数据&Exit SubEnd IfMSComm1.Output = Text1.TextEnd SubPrivate Sub Command2_Click()Unload MeEnd Sub'主要进行串口的初始化Private Sub Form_Load()'选择com1mPort = 1'设置波特率为9.6kpbs,没有奇偶校验,8位数据位,1位结束位MSComm1.Settings = &9600,N,8,1&'读取全部的输入缓冲区MSComm1.InputLen = 0'端口打开MSComm1.PortOpen = TrueMSComm1.RThreshold = 10MSComm1.SThreshold = 10'以下就可以进行数据的发送了End Sub'所有的通讯事件都可以激发MSComm1控件的OnComm事件Private Sub MSComm1_OnComm()Select mEventCase comEvReceive'此处的代码可以进行当串口的接受缓冲区里有RThreshold个字符的处理Case comEvSend'此处的代码可以进行当串口的发送缓冲区里有SThreshold个字符的处理List1.AddItem &发送缓冲区有数据&End SelectEnd Sub
请登录后再发表评论!单片机串口接收多字节数据 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
单片机串口接收多字节数据
22:29:56  
通过串口调试助手向单片机发送11字节数据,帧头为16进制 05,00,00,
我的程序收不到数据是什么情况??求帮助
void Com_Service(void) interrupt 4
rcv_dat[j]=SBUF;
if(j==0&&rcv_dat[j]==0x05)
& &else if(j==1&&rcv_dat[j]==0x00)
& &else if(j==2&&rcv_dat[j]==0x00)
& &for(j=3;j&11;j++)
& &{rcv_dat[j]=SBUF;}
& & Receive_Bflag = 1;
&&ES=0;//关中断,数据发送完成以后再开中断
本帖被以下淘专辑推荐:
& |主题: 12, 订阅: 16
助理工程师
07:21:10  
09:06:05  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
中断程序里面把中断关了,在哪里开中断。
还有,单片机的中断是每接收到一个字节就会产生一次中断。你的程序本身很有问题。
这种程序网上应该有很多,看一看别人的中断服务程序怎么写的。
09:13:59  
popeye0451 发表于
中断程序里面把中断关了,在哪里开中断。
还有,单片机的中断是每接收到一个字节就会产生一次中断。你的程 ...
数据处理完以后&&把中断打开的。
void Com_Service(void) interrupt 4
rcv_dat[j]=SBUF;
Receive_Bflag = 1;
}我用这种方式就可以收到11字节数据,但上边的方法就不行
高级工程师
21:46:10  
是你中断服务程序中判断条件的问题
助理工程师
00:09:29  
14:39:43  
你看一下两段程序关于RI使用的区别就知道了。每接收一个字节都要把RI清零并等待RI置一后接受下个字节。你前面的程序直接就连续接受后面字节了。
21:58:01  
16:35:38  
{:10:}{:10:}{:10:}
助理工程师
20:59:03  
表示不解,学习中!
16:13:48  
if(j==0&&rcv_dat[j]==0x05)
& &else if(j==1&&rcv_dat[j]==0x00)
& &else if(j==2&&rcv_dat[j]==0x00)
这几个判断条件是干嘛用的。
17:19:45  
for循环那里传送多位数据好像有点问题
10:40:43  
可以用C自带的标准函数库:stdio.h中 printf()函数;
10:22:10  
中断程序中,十个字节数据收完后,标志位置1
11:18:36  
现在我也遇到这样的一个问题,实在是没有什么方案可以完成这样的接收工作.查资料中.
20:13:58  
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司- Database Error
The server is currently busy. Please try again later.
已经将此出错信息详细记录, 由此给您带来的访问不便我们深感歉意.君,已阅读到文档的结尾了呢~~
单片机串口通信详解
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机串口通信详解
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 ros与单片机串口通讯 的文章

 

随机推荐