首页 > 其他分享 >树莓派开发相关知识六 -串口通讯

树莓派开发相关知识六 -串口通讯

时间:2024-11-02 14:19:00浏览次数:4  
标签:树莓 通讯 int char 描述符 fd 串口 include

1、uart串口通信

uart串口通信协议,使用txd,rxd双引脚实行异步数据传输,其中txd为传输口,rxd为接收口。

其协议如上图,由起始位+有效数据位+奇偶校验位(*可选),停止位(*宽度可调),空闲位组成,即根据uart协议,当我们需要发送如01010101这8位有 效数据时,我们应该让txd引脚成010101010(LSB低位在前) (0/1根据奇校验,偶校验还是无奇偶校验定) 1(1/1.5/2 脉冲宽度可以是1,1.5,2),后续如果不发数据了,则停留在空闲位。

如果我们选择有效位8位数据,奇校验并停止位宽度为1,则发送数据时发送 01010100111即可。

  • 空闲位:即不发数据时的默认位,取1
  • 起始位:取0,空闲位拉低表示“我要发数据了”,接收端监听低位就知道“你发数据了”,当然这是异步通信,数据收发不“负责”,只管发跟收,没有 ack回应。
  • 有效数据位:低位在前,即先发低位
  • 奇偶校验位:根据协议可设置为奇校验,偶校验,无奇偶校验,奇校验则上述有效位+校验位加起来为奇数,偶校验则有效位+校验位为偶数,无 则没有这个时序
  • 停止位:取1,即拉高表示数据传输结束,保持1/1.5/2个脉冲宽度,可根据协议调整

由于是异步通信,因此收发两端必须通过某种方式进行同步,此同步方式为波特率,所谓波特率即一秒钟有多少个位传输,如115200表示为传输速度 为115200bit/s,每个脉冲宽度为1s / 115200 = 8.68us

即,收发双方都是按照8.68us的节奏来进行数据的“裁剪”工作,达到“同步”。

2、wiringPi串口接口函数

int serialOpen(char *device, int baud)  
device:串口的地址默认一般是"/dev/ttyAMA0"
baud:波特率
返回:正常返回文件描述符,否则返回-1失败。

void serialClose(int fd)
fd:文件描述符    关闭fd关联的串口

void  serialPutchar(int fd, unsigned char c)    
fd:文件描述符
c:要发送的数据

void  serialPuts (int fd, char *s)  
fd:文件描述符
s:发送的字符串,字符串要以'\0'结尾

void  serialPrintf (int fd, char *message, …)   
fd:文件描述符
message:格式化的字符串

int serialDataAvail (int fd)  
fd:文件描述符
返回:串口缓存中已经接收的,可读取的字节数,-1代表错误

int serialGetchar (int fd)  
fd:文件描述符
返回:读取到的字符
如果串口缓存中没有可用的数据,则会阻塞10秒,如果10后还有没,返回-1
所以,在读取前,做好通过serialDataAvail判断下。

void serialFlush (int fd)   
fd:文件描述符
刷新,清空串口缓冲中的所有可用的数据。

3、发送数据测试

 #include <stdio.h>
 #include <stdlib.h>
 #include "wiringPi.h"
 #include "wiringSerial.h"
 int main(void)
 {
	//打开串口,设备驱动为/dev/ttyAMA0
	int fd = serialOpen("/dev/ttyAMA0", 115200);//波特率
	char str[100] = "";
	while(1){
		//发送0xAA,即0B10101010
		serialPutchar(fd, 0xaa);

      //每一秒往串口输出helloworld
       //serialPuts(fd, "helloworld\n");
       //sleep(1);
	}
	return 0;
 }

4、时序分析

按照串口协议,此程序中波特率选择115200,其他没有设置,即默认无奇偶校验,停止位宽度为1,8位有效数据。 开始为起始位为0,有效数据位0B10101010,由于LSB低位在前,因此数据时序就变成01010101倒置,停止位1 因此时序应为0010101011这样的周期时序。

5、使用ttl转usb与计算机进行串口通信,从计算机读取

#include <stdio.h>
 #include "wiringPi.h"
 #include "wiringSerial.h"
 #include <string.h>
 int main(void)
 {
	 //打开串口,设备驱动为/dev/ttyAMA0
	 int fd = serialOpen("/dev/ttyAMA0", 115200);
	 char str[100] = "";
	 int idx = 0;
	 char ch = 0;
	 while(1){
		 //由于串口输入serialGetchar有阻塞,因此通过serialDataAvail接口判断缓存中是否有数据写入,再进行读取
		if(serialDataAvail(fd) > 0){
			 char ch = serialGetchar(fd);
			 str[idx] = ch;
			 
			 if(ch == '\n')
			 {
				 str[idx] = '\0';
				 printf("%s\n", str);
				 idx = 0;
			 }else
			 {
				idx++;
			 }
		 }
	 }
	 return 0;
  }

标签:树莓,通讯,int,char,描述符,fd,串口,include
From: https://blog.csdn.net/weixin_45114627/article/details/143356039

相关文章

  • 嵌入式Linux驱动开发环境搭建-CH340 串口驱动安装
    CH340串口驱动安装驱动安装安装之前一定要连接板子检查驱动是否安上驱动安装我们一般在Windwos下通过串口来调试程序,或者使用串口作为终端,STM32MP157开发板使用CH340这个芯片实现了USB转串口功能。CH340是一款常用的USB转串口转换芯片,通常用于将USB接口连......
  • 记录一次大炮打蚊子的modbustcp通讯连接异常问题定位事件
    一.问题描述某种场景下,安装有Ubuntu22系统的设备A开机后,1-2min内设备E遥控器不能遥控设备A移动,之后恢复正常。二.设备组网设备A和设备C之间使用modbustcp协议进行通讯。三.首战3.1查看日志放开该端口的modbus查询帧日志打印,发现整体的帧格式,发现返回了modbus数据帧,但是返......
  • 越疆机器人与上位机的通讯
        越疆机器人的开发终于整完了。整体来说这个算比较简单,但是由于本身越疆是通过他们自己的上位机进行控制与通讯,并不是单纯用lua解释器去运行,因此效率属实不算高。最近也是在搞UR的开发,这个真的是一言难尽,明天加班的时候再吐槽。    首先确认一点,越疆机器人......
  • i2c与从设备通讯编程示例之i2c编写程序
    对于我们ELF 1板卡来说,我们前面看到的i2c-0、i2c-1总线对应着CPU的两个i2c适配器,作为主设备,而总线上挂载的设备作为从设备。如/dev/i2c-1对应的适配器作主设备,其上面挂载的光线传感器就作为从设备。前面我们了解了i2c的通讯协议,也初步用i2c-tools尝试着读写了一个从设备寄存......
  • 树莓派5安装ollama+open-webui
    新购置了个PI5,就想着折腾些什么。除了给它装codesys之外,想到(尤其是看到官配的冷却风扇)是不是能跑个AI什么的。捜了一下,除了TensorFlowLite、PyTorchMobile还有做视觉的OPENCV和YOLO。除此之外,一个熟悉的词汇又冒了出来。ollama。记得有段时间看到很多短视频推送,想着就找下资料看......
  • Python之pyserial模块 串口通信
    python之pyserial模块原文链接:https://www.cnblogs.com/sureZ-learning/p/17054481.htmlpyserial模块封装了对串口的访问,兼容各种平台(Windows、Linux、MACOS等)。其支持的特性如下:所有平台基于类的接口相同端口可以通过python来设置支持不同数据长度、停止位、奇偶校验位、流......
  • 记录串口电脑往下发,没有写进数组的问题
    1voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart)2{3/*Preventunusedargument(s)compilationwarning*/4UNUSED(huart);5if(RxCnt>=10)6{8RxCnt=0;10//将数组指向的地方的前sizeof内存用0X00替换,将数组初始化......
  • 带内串口 在串口中输入命令
    defhioadm_shell(self,start_cmd,cmd,wait_str='PressCTRL+C',wait_time=2,record_size=10240):"""进入盘内命令hioadmshell+控制盘Args:start_cmd:hioadmshell+devicecmd:nextcmdRet......
  • 如何快速解决RS-485组网通讯异常?
    RS-485总线的好处大家都知道,用隔离模块能让通信更稳定。但实际用的时候,可能会遇到通信不了、出错或者收发器坏掉的问题。本文将深度剖析RS-485组网问题。应用问题当出现通信错误或者不能通信时首先判断应用是否符合表1中的应用情况。表1RS-485总线应用情况表1中三种......
  • C# 串口通讯工具类,一个函数发送命令等待并接收返回数据(适用和仪器仪表通讯)
     一般的串口通讯类或者nuget包提供的串口通讯功能,发送和接收数据是分开的。当需要与仪器或者仪表交互大量指令和数据时,分开收发十分不方便,也不好维护。 所以将发送和等待接收返回的数据写成一个函数来操作完成就十分的方便,这里提供一个非常好用的C#串口通讯工具类,其内部......