uart

串口通信——UART

丶灬走出姿态 提交于 2020-01-10 04:52:16
一、总体概况 串口:有UART(通用异步收发器,单/半双/全双工),SPI(串行外设接口,半/全双工),I²C(集成电路总线,半双工)3种通信接口,他们都是串口, 并口:有SDIO(4位并行)用来插SD卡;FSMC(16位并行),控制液晶或显存(SRAM) 比特率·:bit/s 波特率:码元/s 一般的:0V-----0 3.3V-----1,很多时候都是按这个来算码元,所以一个码元就是一个比特。 但是 也有时候是好几个比特表示一个码元:0V----00 2V—01 4V—10 6V—11,此时就是俩个比特一个码元 当然,rbt6中,比特率=波特率 二、USART(通用同步异步收发器) 从框图上看,USART总共需要8根引线,而开发板上只有俩条引脚RX和TX RX:数据接受 TX:数据发送 SCLK:时钟,在保持同步时使用 nRTS:请求发送(前面n的意思是低电平有效) nCTS:允许发送 其他俩个引脚基本不用 (开发板上是UART,不是USART,因此不能实现同步通信,所以,SCLK、nRTS、nCTS都是不使用的) 根据原理图,我们发现,USB转串口(调试串口)CN2接口连接了芯片FT2232D,芯片FT2232D的引脚有RXD2和TXD2,连接到了PA3和PA2上,在开发板上标注着,这俩个GPIO是UART2。 相应的,UART1的RXD1和TXD1连接到了PA10和PA9

AVR单片机教程——ADC

笑着哭i 提交于 2020-01-10 01:28:52
ADC 计算机的世界是0和1的。单片机可以通过读取0和1来确定按键状态,也可以输出0和1来控制LED。即使是看起来不太0和1的PWM,好像可以输出0到5V之间的电压一样,达到0和1之间的效果,但本质上还是高低电平。 但是,世界上终究还是有0和1无法表示的。如果引脚上被施加0到5V之间的电压,寄存器 PINx 无法告诉我们具体情况,只能指示这个电压是1.5V以下还是3V以上(参考数据手册“Electrical characteristics”)。这种可以连续变化的信号称为 模拟信号 ,与离散的、只能取0或1(0或5V)的 数字信号 对立。 这并不代表数字世界无法处理模拟信号,相反,一种相当常用的处理模拟信号的方法,就是把模拟信号转换成数字信号,用处理器来运算,然后再转换成模拟信号。这个过程中涉及到模拟-数字转换和数字-模拟转换,分别需要ADC和DAC来实现。大多数单片机,作为现实世界中的工具,需要接触模拟信号,尤其是模拟信号的输入,会集成ADC。 ADC的一个参数是分辨率,指它的位数,反映了可以产生的不同输出的数量(8位ADC可以产生0~255的值)与量化最小物理量(通常是电压)的能力(比如当参考电压为2.56V时,理想情况下,8位ADC可以分辨两个相差0.01V的电压的不同)。AVR单片机带有的ADC是10位的。 另一个参数是转换速率,每秒进行A/D转换的次数

Master for Interrupt based UART IO

丶灬走出姿态 提交于 2020-01-07 00:35:30
问题 The interrupt based UART IO allows the data transfer to take place without intervention of CPU. Now the question is, if not CPU who controls this ? Is it the DMA controller or some external master who gets the control over memory bus from CPU. Didn't get a proper answer here . If it is the DMA controller then what makes DMA and interrupt based transfer different 回答1: Didn't get a proper answer here . If it is the DMA controller then what makes DMA and interrupt based transfer different That

STM32基于Rt-thread3.12系统的串口通讯

泪湿孤枕 提交于 2020-01-06 23:10:32
前言 STM32的串口收发可以说是对这个芯片学习的一个基础,相信接触过STM32的朋友首先学会的就是它的GPIO和USART。对GPIO和串口初始化的操作我在这里不做赘述,这些在STM32的例程里面很容易找到学会。我们在这里重点介绍STM32的串口中断接收,以及在RTT系统中我们如何把串口device注册到系统的对象容器里。 关于RT-Thread3.12系统 作为国产小型嵌入式系统中的翘楚,RTT也是被大多数产品所使用。我参与的这个项目RTT的主要工作就是多线程调度和串口device的控制。对于线程的调度先不详细说明,我们这里只介绍串口通讯一个线程的东西。 RTT对象 在 RT-Thread中,所有的数据结构都称之为对象。 其中线程,信号量,互斥量、事件、邮箱、消息队列、内存堆、内存池、设备和定时 器在 rtdef.h 中有明显的枚举定义,即为每个对象打上了一个数字标签。我们这里的对象就特指设备,而我们的设备就特指串口。 那么我们使用这个对象有什么用处呢,我私以为有两个最大的用处,一是有利于设备管理,二是基于程序安全考虑。我使用这一功能的时候基本与第一个用处不沾边,因为我们就一个串口设备。主要还是基于安全的考虑才使用RTT对象。 使用系统的对象也就是把硬件驱动注册到系统中,让系统对就硬件进行操控,我们再通过系统操控硬件。 串口注册到系统

Non blocking read with fixed data in input

不问归期 提交于 2020-01-06 18:45:32
问题 I want use serial port to communicate with another device txdev, the problem is that txdev is sending data asynchronously and i don't want the read function to block, the good thing is that txdev is sending data with fixed size but i don't know how to use this trick. what i'am doing is the following : fd = open(DEVICE_NAME, O_RDWR | O_NOCTTY); bzero(&termios_p, sizeof(termios_p)); termios_p.c_cflag = CS8|CSTOPB|CLOCAL|CREAD; termios_p.c_iflag = IGNPAR; termios_p.c_oflag = 0; termios_p.c_lflag

PySerial can read but not write

筅森魡賤 提交于 2020-01-06 04:36:20
问题 I'm trying to use PySerial to connect to an FTDI FT232R chip. I have verified communication with my RealTerm and, using RealTerm, can both send and receive data. However, my implementation in Python can only receive data. I am trying to write using this line: for i in range(0,100): print "Loop "+str(i) print "Sending byte" ser.flush() print ser.write("B".encode('ascii')) time.sleep(1) 回答1: Comunication depends on the configuration of the chip, the connecting cable and the parameters of

Interrupts in UART 16550 and Linux Kernel

半城伤御伤魂 提交于 2020-01-04 06:57:28
问题 I'm trying to use interrupts to see if there are errors in an UART 16550D and when a character is available to be read. The UART configurations is as follows: #define UART 0x03f8 // Endereço da Porta Serial - I (com1) #define UART_IER 1 #define UART_LCR 3 #define UART_LSR 5 #define UART_DLL 0 /* Out: Divisor Latch Low */ #define UART_DLM 1 /* Out: Divisor Latch High */ #define UART_LSR_THRE 0x20 /* Transmit-hold-register empty */ #define UART_LSR_DR 0x01 /* Receiver data ready */ #define UART

UART接收模块的Verilog实现

心已入冬 提交于 2020-01-04 03:06:09
大致思路如下: 【1】在复位状态下,寄存器清零。 【2】将波特率时钟分成16段(即计数满16次产生一个ce_1脉冲),在计数满八次时产生ce_1_mid脉冲信号,进行采样(中间的数据比较稳定),将采用的数据放到移位寄存器in_sync中进行存储,同时会将数据缓存到大。data_buf进行存储,然后传送到输出端。 //--------------------------------------------------------------------------------------- //out<={in,out[3:1]}; 这是在将out[3:0]右移一位,舍弃最低位out[0]同时高位移入in。 // uart receive module // //--------------------------------------------------------------------------------------- module uart_rx ( clock, reset, ce_16, ser_in, rx_data, new_rx_data ); input clock; input reset; input ce_16; // 波特率时钟产生 input ser_in; // 串行数据输入 output [7:0] rx_data; // 接收的新数据

9 bits uart emulation with /dev/tty*

孤街醉人 提交于 2020-01-02 15:45:54
问题 I have a uncommon protocol, which requires 9600 baud, 9 bits and one stop bit. I can't find any driver, which can implement this sending/receiving. Can I send something to /dev/tty* for emulating these queries? What should I send? How can I emulate a 9600 baud rate? 回答1: You can use sticky parity, which is also called MARK and SPACE parity. termios.h supports this. However, you need to change the parity settings before sending address or data bytes accordingly and depending on the hardware,

Enabling UART on Beaglebone Black

大憨熊 提交于 2020-01-01 18:53:49
问题 I'm having trouble getting UART enabled. I've gone through many different directions on how to enable and troubleshoot from updating the uEnv.txt file to updating the kernel. I've come to conclude that it may be an issue with using a different kernel than the instructions, but I'm not sure? I don't know very much about the Beaglebone and I'm still learning. Whenever I try to test UART by using Python and typing the following: import Adafruit_BBIO.UART as UART UART.setup("UART1") I get the