uart协议及接口

UART使用的是异步、串行通信。

串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。

异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。

数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。

数据通信格式如下图:

其中各位的意义如下:

起始位:先发出一个逻辑”0”信号,表示传输字符的开始。

数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输

校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。

空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)

1.UART

UART(Universal Asynchronous Receiver and Transmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。

而RS232、RS499、RS423、RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容,这些东东都是物理层的概念。

通信协议,是属于通信网络中的数据链路层的概念。

1.1 RS232

COM口是PC(个人计算机)上,异步串行通信口的简写。由于历史原因,IBM的PC外部接口配置为RS232,成为实际上的PC界默认标准。所以,现在PC机的COM口均为RS232。

上图最右边的是串口接口,统称为RS232接口(封装DB9)

通信过程中实际只有两个管脚参与通信

2脚:电脑的输入RXD

3脚:电脑的输出TXD

5脚:接地

通过2,3脚就实现全双工(可同时收发)的串行异步通信

1.2 UART通信协议

UART使用的是 异步、串行通信。

串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。

异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。

数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。

数据通信格式如下图:

其中各位的意义如下:

起始位:先发出一个逻辑”0”信号,表示传输字符的开始。

数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输

校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。

空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)

3. Uboot 串口驱动

  1. board_init_r()
  2. --》devices_init()
  3. --》drv_system_init()
  4. 创建串口设备 serial,放到全局数组devlist[]中去
  5. struct device_t serial{
  6. .name = "serial"
  7. .putc = serial_putc; //这些函数是芯片相关的
  8. .puts = serial_puts;
  9. .getc = serial_getc;
  10. .gets = serial_gets;
  11. }
  12. --》console_init_r()
  13. --》设置钩子函数,这些函数是硬件相关的
  14. gd->jt[XF_getc] = serial_getc;
  15. gd->jt[XF_tstc] = serial_tstc;
  16. gd->jt[XF_putc] = serial_putc;
  17. gd->jt[XF_puts] = serial_puts;
  18. gd->jt[XF_printf] = serial_printf;
  19. --》在devlist[]中搜索,初始化标准输入,标准输出和错误输出的device_t指针
  20. inputdev = search_device (DEV_FLAGS_INPUT, "serial");
  21. outputdev = search_device (DEV_FLAGS_OUTPUT, "serial");
  22. errdev = search_device (DEV_FLAGS_OUTPUT, "serial");
  23. --》文件描述符file_no与设备device_t绑定,初始化stdio_devices[file_no] = dev
  24. console_setfile (stdout, outputdev);
  25. console_setfile (stderr, errdev);
  26. console_setfile (stdin, inputdev);

Uboot中,串口打印流程

  1. printf-->puts-->fputs
  2. void fputs (int file, const char *s){
  3. if (file < MAX_FILES)
  4. stdio_devices[file]->puts(s);
  5. //调用的函数为serial_puts,芯片相关不分析
  6. }

4. Linux串口驱动

  1. start_kernel()
  2. --> console_init()
  3. -->cpm_uart_console_init()
  4. -->register_console(&cpm_scc_uart_console)
  5. console->setup()
  6. //最终调用cpm_uart_cnsole_setup()
  7. //初始化uart控制器,并将console 结构加入到 console_drivers 列表中去

注意,

由于我们在console_init中调用cpm_uart_console_init时,

因为当时uart port的基址等基本参数都没有确立, 故其中调用console->setup 以失败返回,

即调用register_console 没有成功注册,

故后面在do_initcalls中调用 cpm_uart_init()进行初始化时,

其初始化中调用uart_configure_port会再次调用register_console

这次由于uart port的基址等参数得到初始化,故register_console成功

  1. do_initcalls()
  2. -->cpm_uart_init()
  3. -->uart_register_dirver(&cpm_reg)
  4. for( i=0; i< cpm_uart_nr; i++)
  5. con = cpm_uart_port_map[i]
  6. -->uart_add_one_port(&cpm_reg, &cpm_uart_ports[con].port)
  7. //行参(struct uart_driver *drv, struct uart_port *port)
  8. 注意这里有 port->cons = drv->cons;
  9. -->uart_configuare_port(drv, state, port)
  10. --> port->ops->config_port(port, flags)
  11. //这里port的ops是 cpm_uart_pops
  12. //即调用cpm_uart_config_port, 初始化buf,bd,controlller,enable rx/tx
  13. --> cpm_uart_request_port(port)
  14. cpm_uart_allocbuf(pinfo,0)
  15. cpm_uart_initbd(pinfo)
  16. cpm_uart_init_scc(pinfo)
  17. -->uart_report_port(drv,port)    //打印串口相关信息
  18. -->register_console(port->cons)    //形参(struct
    console *console)
  19. //加入到 console_drivers 列表中去
  20. -->uart_console(port)

printk在src/kernel/printk.c中实现

  1. int printk(const char *fmt, ...)
  2. static char printk_buf[1024];
  3. // 函数内申请了一块静态内存printk_buf[]作为format缓冲区,然后把缓冲区内容放到LOG_BUF中
  4. // 不管console是否存在,printk都成功返回。
  5. --> release_console_sem();
  6. --> call_console_drivers();
  7. -->_call_console_drivers(start_print, cur_index, msg_level);
  8. // 对console驱动中write的调用
  9. for (con = console_drivers; con; con = con->next) {
  10. if ((con->flags & CON_ENABLED) && con->write)
  11. con->write(con, &LOG_BUF(start), end - start);
  12. }
  13. con->write() 实际上是
    cpm_scc_uart_console.write
  14. 即 cpm_uart_console_write()
时间: 2024-11-02 21:39:08

uart协议及接口的相关文章

UART协议的FPGA实现(线性序列机)

实现uart其实早就写了,不过不太完善,对于一个完美主义者来说,必须解决掉它. 1.什么是UART? 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器.是异步通信协议. 2.什么是RS232? RS232是物理层的电气接口要求.是一种接口标准.uart可以使用rs232物理层来通信.总的来说,对于一项通信任务,通信协议可以使用UART协议,而UART协议可以通过COM端口来实现硬件连线,此协议下的

11. Dubbo原理解析-注册中心之基于dubbo协议的接口介绍

服务注册与发现的中心,服务的提供者将服务发布到注册中心,服务的使用着到注册中引用服务. Dubbo的注册中心提供了多种实现,其实现是基于dubbo的spi的扩展机制的,使用着可以直接实现自己的注册中心. @SPI("dubbo") public interface RegistryFactory { /** * 连接注册中心. * 连接注册中心需处理契约 * 1. 当设置check=false时表示不检查连接,否则在连接不上时抛出异常. * 2. 支持URL上的username:pas

Swift语言的扩展与协议(接口)

/* 类型转换 1.没有任何关系的两个类型之间的转换 2.继承链条里的向上与向下转型 */ //第一种形式 let i = 3 let str = "\(i)" let str2 = String(i) //第二种形式 class Parent { var p = 1 } class Child:Parent { var c = 2 } //as是用来转换的 let c: Parent = Child() let cc = c as? Child cc?.c if let ccc =

UART协议

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART,读音/?ju?art/)是一种异步收发传输器,是电脑硬件的一部分,将资料由串行通信与并行通信间作传输转换.一般和类似Maxim的MAX232之类的标准信号幅度变换芯片进行搭配,作为连接外部设备的接口.在UART上追加同步方式的序列信号变换电路的产品,被称为USART(Universal Synchronous Asynchronous Receiver Transmitt

使用Jayrock开源组件开发基于JSON-RPC协议的接口

最近接手一个以前的项目,无意间发现此项目开发接口的组件:Jayrock(接口组件估计用的少,用的最多的估计是这个Jayrock.json.dll,用于解析json) 以下是Jayrock的介绍官网: https://atifaziz.github.io/projects/jayrock/ 如果你在开发上使用了该组件,上面的官网会是一个不错的入门教程. 在研究的过程中,发现Jayrock有以下的特定,主要从开发角度方向进行分析. 优点如下: 1.接口开发和部署简单,直接继承组件的JsonRpcHa

协议and接口

最近在看HTTP协议方面的书,具体内容都只是做了一个大概的原理了解.但感触最深的是接口和协议. HTTP协议由chrome这样的浏览器和Apache这样的服务器共同实现. HTML协议由chrome这样的浏览器和开发者共同遵守. dom协议由浏览器和开发者共同遵守. servlet协议由开发者和tomcat这样的servlet容器共同遵守. 协议是由多方共同遵守的一个规则. 接口是合作双方中的一方给出的一个规则. 对于开发者来说,servlet协议同时也是tomcat服务器的使用接口. 再有就是

Jmeter实现WebSocket协议的接口和性能测试方法

WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). 浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送.在此WebSocket 协议中,为我们实现即时服务带来了两大好处: 1. Header  互相沟通的Header是很小的-大概只有 2 Bytes 2. Server Push 下面是客户端浏览器请求和服务器回应 浏览器请求 GET /demo HTTP/

IOS 采用https 协议访问接口

申请好证书后,发现ios 仍无法使用https协议访问到数据,发现ios 需要ssl 支持 TLS1.2 . 更改nginx 配置: ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA

【TCP_协议_socket接口】-jmeter

1.ip 2.端口号 3.传入参数 4.告诉软件返回  最后以为是什么,不然就会报错 或者无限制的等待  查ascll 码表 启动接口的方法 原文地址:https://www.cnblogs.com/zhenyu1/p/10651581.html