如何用串口将数据传给单片机里面的寄存器?也就是串口接收的数据来更新寄存器的值

2021-09-06 02:05:14 字数 2411 阅读 6155

1楼:匿名用户

举个例子吧,将pc发送来的数据,依次存入到30h开始的内部ram中。

org 0000h

ljmp main

org 0030h

main:

mov tmod,#20h

mov th0,#0fdh

mov tl0,#0fdh

setb tr1

mov scon,#50h

mov r0,#30h

mov r2,#80

loop:

jnb ri,$

clr ri

mov a,sbuf

mov @r0,a

inc r0

djnz r2,loop

sjmp $end

2楼:小毛豆

正常发送就行了,比如用电脑的串口精灵,单片机接收后会自动将8位数据送入sbuf寄存器中,并将串口接收标志位ri置1,直接从中读取就行了。发送也是一样,将8位数据送入sbuf寄存器,单片机就会自动发送数据,发送完毕后会将串口发送标志位ti置1。

3楼:百度网友

先用串口助手等工作(或自己编写的程序)通过计算机串口(com口)发送数据到单片机,当然单片机需要编程比如中断方式接收来自计算机发的数据,接到后将其存入单片机寄存器对应地址。

在单片机中,串口接收到的数据是放在串口里还是单片机里面?

4楼:布镶岚

串口接收到的数据是放在数据缓冲寄存器(sbuf)里面,数据缓冲寄存器是集成在单片机里面的。

串口接收数据时数据先存放在sbuf里面(接收过程中单片机照常工作),接收完成串口后向单片机发出中断请求,单片机将数据取走。发送时也是一样,数据先送到sbuf里,再由sbuf往外发。

5楼:匿名用户

是放在单片机的串口寄存器里面

单片机编程中 如何清除串口接收寄存器中的值,即清除sbuf中的值 10

6楼:做而论道

追问:可是我做实验,需要清除。以便接收到新的不同的值,从而单片机做出相应的动作回答清除标志位

----

不用清除。也不可能清除。

可以这样做:

每收到一个新数据,就置位一个自定义的标志位,如:r_flag = 1;。

程序中,一旦发现它为1,就进行一次处理,然后就将其清零:r_flag = 0;。

这样,收到一个,就仅仅处理一遍。

7楼:匿名用户

单片机的sbuf是不需要清零的!

你是模拟串口通信吗?

不管是模拟串口通信还是硬件串口通信,都是是不需要清零的.因为模拟串口通信时是判断串口有无起始位来决定是否接受数据,而硬件串口sbuf是自动接收数据,并会产生一个中断,这时你只需要读出sbuf的值就行了。

labview串口接收到的数据怎样实时更新?

8楼:匿名用户

如果你每次收到的字节数能确定(比如每条发过来的命令字节数固定,或者最前一两个字节表示后面的字节数),就按照字节数接收。然后直接把收到的字符串给显示控件,不使用移位寄存器或反馈节点当然就不显示之前的字符了。

别加“等待”之类的函数(手表图标哪个),串口读取函数会在读到指定数量的字符或到达超时之后返回读到的字符串。用它就能控制循环。也就是说来一条命令或者到达一次超时之后,自动循环一次,字符串显示控件里面的值就是刚收到的字符串了。

如下图:

串口的参数我就使用默认的“9600,8,n,1”了,超时值我设置的是100ms,为了让程序运行时不会因为默认的10000ms超时显得程序卡死。但是几乎每100毫秒就会有一个超时错误并返回空字符串,所以内层的错误分支什么也没做,在超时的时候不用空字符串替换原有的显示值。

如果字符数不确定,你还不想保留之前的值,那就不好办了。很有可能会造成一句话分两次显示的情况,某次显示前面一部分,后面一次显示后一部分。

看下图吧:

为减少上述情况的出现,我把超时值改为了1000ms,后面的条件分支根据读到的字节数区分。0的时候不更新显示控件,其它值的时候显示刚刚收到的字符串。因为你不要和前面的拼凑,所以有可能是不完整的。

其实也可以让字符串显示控件自动滚动,或者字符串长度达到一定长度时或点清空按钮时,清空显示值。可以用反馈节点/移位寄存器/局部变量/值属性等。

下图的做法最简单,因为用的是输入控件,可以随便删除之前的内容。

9楼:tn瓶邪

使用移位寄存器功能。在循环框左边框或右边框上点右键,添加移位寄存器,将采集到的数据连到右边的寄存器端口,再从外界连到左边的寄存器入口,里面再加一个函数将寄存器入口的数据与新鲜采集到的数据合并,然后引到输出控件上。

从需实现一个类似这样的功能: display = old data + new data