串口发送与接收数据

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-05-05

使用RS-485串口进行通讯。
1.定义串口接收数据的缓冲区,最大可以保存64个字节 u8 RS485_RX_BUF1[64];
2.定义接收发送数据的长度 u8 RS485_RX_CNT;
3.发送数据的函数一般有两个printf和 USART_SendData,这里主要说USART_SendData的使用。printf实现的是格式化字符串,字符串比较有优势。
USART_SendData传递单个字符和指令。
4.给发送方定义一个标记位 u32 flags_send1; flags_send1

5.要发送的事件很多定义一个枚举类型的数据,将所有要发送的事件放入枚举类型数据中。

枚举类型数据将第一个定为1,其他的数据依次加1.
6.定义一个发送事件函数SendCmd(u8 cmd)

定义

7.假设要传递E_CKEYDN_INUSE1事件,要实现事件的传递,就应该将事件做参数传入SendCmd(u8 cmd)函数
此时flags_send1 |= EBIT(9)=;由第四点知道flags_send1是一个32位的无符号整型数据。所以 flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111
8.(1)UARTSend1()函数

此时的flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111;
sb[2] = (flags_send1 >> 0) & 0xff = 1111 1111;
sb[3] = (flags_send1 >> 8) & 0xff = 0000 0001;
sb[4] = (flags_send1 >> 16) & 0xff = 0000 0000;
sb[5] = (flags_send1 >> 24) & 0xff = 0000 0000;
(2)checksum()函数

d0=(senddata >> 0) & 0xff=0000 0001 1111 1111;
d1=(senddata >> 8) & 0xff=0000 0001 & 0xff=0000 0000 0000 0001;
d2=(senddata >> 16) & 0xff=0000 0000 & 0xff = 0000 0000 0000 0000;
d3=(senddata >> 24) & 0xff=0000 0000 & 0xff = 0000 0000 0000 0000;
sum=0000 0010 0000 0000;
~sum=1111 1101 1111 1111;
sb[6] = (sum >> 0) &0xff = 1111 1111 & 0xff = 1111 1111 ;
sb[7] = (sum >> 8) &0xff = 1111 1101;
(3)
为什么定义sb[8]的前两位是0x55,0xaa?

0xaa是1010 1010,0x55是0101 0101在通讯编码原理中,应该避免过多的重复0或者1,因为当传输变成一个长0/1时,一个脉冲干扰就会将数据截断,增加误码的概率。若通讯机不能接受10101010或者01010101,那么就是线路出现问题。这是一个判断线路状态的手段。

9.串口1接收数据
(1)通过UARTRead1()函数实现

receive += (RS485_RX_BUF1[2] << 0) = 0000 0000 0000 0000 0000 0000 1111 1111; ;
receive += (RS485_RX_BUF1[3] << 8) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[4] << 16) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[5] << 24) = 0000 0000 0000 0000 0000 0001 1111 1111
(2)将receive传入checksum(u32 senddata)函数中
d0= 0000 0000 1111 1111;
d1=0000 0000 0000 0001
d2= 0000 0000 0000 0000
d3=0000 0000 0000 0000
sum=0000 0001 0000 0000
~sum = 1111 1110 1111 1111
(3)定义接收数据标记位是 u32 flags_receive1;
通过判断RS485_RX_BUF1[6] 、RS485_RX_BUF1是否等于 ((sum >> 0) & 0xff)、((sum >> 8) & 0xff))来判断读入的数据是不是正确的。
RS485_RX_BUF2[6] ==1111 1111
RS485_RX_BUF2[7] == 1111 1110
正确时
接收到的数据是flags_receive1 = receive= 0000 0000 0000 0000 0000 0001 1111 1111;
不正确时 flags_receive1 |= EBIT(E_ERROR); 接收数据标记位置为错误位。



  • 串口数据发送和接收的原理是什么
    答:串口数据发送的原理是,数据以位为单位进行编码,然后按一定的速率发送到另一台设备。在发送过程中,串口控制器生成一些控制信号,如数据结束信号、请求发送信号等。串口数据接收的原理是,接收设备按照一定的速率接收数据位并编...
  • 串口(串行通信接口)
    答:串口通信是通过发送和接收数据帧来实现的。数据帧由起始位、数据位、校验位和停止位组成。起始位用于标识数据帧的开始,数据位用于传输实际的数据,校验位用于检测数据的正确性,停止位用于标识数据帧的结束。在发送数据时,计...
  • 为什么用串口调试助手,发送和接收的数据不一样?
    答:1. 波特率设置不正确:串口调试助手和接收设备需要设置相同的波特率。如果波特率设置错误,发送和接收的数据将不一致。请确保用正确的波特率设置发送和接收数据。2. 数据格式不正确:如果发送和接收设备的数据格式不一致,发送的...
  • RS-232C标准接口中发送数据和接收数据的针序号是什么?
    答:计算机串口(RS232)共有9个针脚,都是按顺序排列,各个针脚的定义如下:1、针脚1的定义 :载波检测(DCD) ,接收线信号检出(Received Line detection-RLSD)。2、针脚2 的定义:接受数据(RXD) ,为接收数据的引脚。3、针脚...
  • 串口发送与接收数据
    答:1.定义串口接收数据的缓冲区,最大可以保存64个字节 u8 RS485_RX_BUF1[64]; 2.定义接收发送数据的长度 u8 RS485_RX_CNT; 3.发送数据的函数一般有两个printf和 USART_SendData,这里主要说USART_SendData...
  • 串口通讯原理
    答:接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。
  • 51单片机通过串口实现数据的发送与接收程序
    答:一般来说,过程如下:1,配置串口参数、波特率等,开启串口中断;void Init_UART(){ } 2,中断函数里写中断响应函数,根据接收的指令或者数据,执行相应的动作;程序一般为:void UART_ISR() interrupt x using y {...
  • 串口通讯有4种工作方式,请问分别是什么呢?
    答:接着接收便搜索另一帧信息的起始位。3、方式2和方式3 串行接口工作方式2和方式3时,则被定义为9位的异步通信接口。传送一帧信息为11位,其中1位起始位,8位数据位(从低位至高位),1位是附加的可程控为1或0的第9位...
  • 简述串行口接收和发送数据的过程。
    答:在满足串行口接收中断标志位R1=0的条件下,置允许接收位REN=1就会接收一帧数据进行移位寄存器,并装载和接收到SBUF中,同时使R1=1当发读SBUF命令时(执行 MOVA SBUF)便由接收缓冲期SBUF的信息通过内部总线送到CPU。
  • 怎么用串口调试工具接收PLC发送的数据
    答:如下图所示设置路径。5、前面的这些步骤设置完成后就可以直接打开串口,接收报文了,如下图所示打开串口按键。6、串口调试工具的上部分为接收报文界面,下半部分为自己发送的报文,来得到设备的回复,如下图所示。