-
串口编程
2019-04-22 15:32:31串口编程* https://www.cnblogs.com/xiaojianliu/p/8473116.html#_label5展开全文 -
Android 串口编程
2011-11-28 23:28:32Android 串口编程,《Android 串口编程原理和实现方式》代码 -
Qt5.7串口编程
2018-07-09 16:22:19Qt5.7串口编程Qt5.7串口编程Qt5.7串口编程Qt5.7串口编程Qt5.7串口编程 -
UART0串口编程(二):串口编程的硬件原理;轮训方式的串口编程
2018-01-12 20:24:53UART0串口编程(二) 本节针对的是ARM2200环境下编写串口程序,其中设计轮循方式,中断方式,以及在UC/OS-II操作系统下的串口编程。使用轮循和中断两种方式来实现串口编程。用中断实现串口编程,系统的效率较高,...UART0串口编程(二)
本节针对的是ARM2200环境下编写串口程序,其中设计轮循方式,中断方式,以及在UC/OS-II操作系统下的串口编程。使用轮循和中断两种方式来实现串口编程。用中断实现串口编程,系统的效率较高,但是难度也较大 ;轮循方式效率较低,但是编程比较简单。
一.串口编程的硬件原理
1. 串口特性:
1>16字节接收FIFO和16字节发送FIFO
2>接收FIFO触发点可设置为1,4,8或14字节。
3>内置波特率发生器。
2. UART0引脚:
1>RxD0 引脚用于UART0接受数据,接受方式为串行输入。
2>TxD0引脚用于UART0发送数据,发送方式为串行发送数据。
3. UART0的结构和工作方式
先看图在说明:
1> VPB总线提供CPU与UART0之间得的通信连接
(CPU内核通过VPB接口对UART0的寄存器进行读写访问.)
2> UART0 接收器模块监视串行输入线RxD0的有效输入。UART0 接收单元的移位寄存器(U0RSR)通过RxD0接收有效的字符。当U0RSR接受到一个有效字符时,它将该字符传送到UART0 接收单元缓冲寄存器FIFO中,等待CPU通过VPB接口进行访问。
3> UART0发送器模块接收CPU或主机写入的数据并将数据缓存到UART0 的FIFO或U0THR中,UART0发送模块中的移位寄存器(U0TSR)读取U0THR或FIFO中的数据并将数据通过串行输出到引脚TxD0发送。
4> UART0的接收模块和发送模块的状态信息保存在U0LSR中。
控制信息保存在U0LCR中。
5> UART0波特率发送器模块产生UART0 发送模块所使用的定时。波特率发生器模块时钟源为VPB时钟(pclk)。主时钟与U0DLL和U0DLM寄存器所定义的除数相除得到UART0 发送器模块使用的时钟,该时钟必须为波特率的16倍。
6> 中断接口包含寄存器U0IER和U0IIR。中断接口接收UART0发送模块和接收模块发出的单时钟宽度的使能信号。
4. UART0和ARM7 CPU之间的通信过程
1>CPU通过UART0发送模块发送信息给外设
第一:CPU发出信息通过AHB总线到AHB-VPB桥
第二:通过AHB-VPB桥把信息转换后发送给VPB总线。
第三:UART0接收模块接受来自VPB总线的数据。并将数据缓存到U0THR寄存器中。
第四:UART0接受模块的移位寄存器U0TSR读取U0THR中的数据 并将数据通过输出引脚TxD0发送。
2>外设通过UART0接收模块向ARM7 CPU发送信息
第一:UART0移位寄存器(U0RSR)通过引脚RxD0接收有效字符。
第二:当UART0接收到一个有效字符后,通过读取U0RBR寄存器可以将FIFO中最早接收到的字节读出,当FIFO中不再包含有效数据时,该寄存器反映接收到的最后一个有效字节数据。接收的数据不足8位时,高位用0填充。
第三:VPB总线将缓冲寄存器(U0RBR)中的数据通过AHB-VPB桥传到AHB总线上
第四:AHB总线将数据传送给ARM7 CPU。
二.轮训方式的串口编程
1. 串口程序都有那几部分组成如下图:
1> 串口初速化
A. 串口初始化的流程
第一:设置I/O引脚连接到UART0
第二:设置串口波特率
第三:设置串口工作模式
B. 串口初始化需要设置的寄存器
第一:U0LCR(控制寄存器):设置UART0的通信格式。
第二:U0DLL,U0DLM(寄存器):设置UART0的通信波特率。
C. 具体寄存器的设置
(1) U0LCR(线控制寄存器)
第一:作用:设置通信格式(通信字符长度,停止位个数,奇偶校验位
第二:长度:8位寄存器
第三:各位寄存器的含义:
第[1 ,0]位: 表示字长
00:表示5位字长
01:表示6位字符长度
10:表示7位字符长度
11:表示8位字符长度
第2位: 表示停止位选择
0:1个停止位
1:2个停止位
3位:表示奇偶使能
0:禁止奇偶产生和校验
1:使能奇偶产生和校验
注:奇偶使能:控制是否进行奇偶校验。如果使能,发送时将添加一位校验位。
第[5 4]位:表示奇偶选择位
00:奇数(数据位+校验位=奇数)
01:偶数(数据位+校验位=偶数)
10:校验位强制为1
11:校验位强制为0
注:奇偶选择主要是设置奇偶校验类型。
第6位:间隔控制
0:禁止间隔发送
1:使能间隔发送
注:当该位为1时,输出引脚(TxD0)强制为逻辑0,可以引起通信对方产生间隔中断。在一些通信方式中,使用间隔中断作为通信的起始信号(eg:LIN Bus)
第7位:除数锁存访问位
0:禁止访问除数锁存寄存器
1:始能访问除数锁存寄存器
(2) U0DLL,U0DLM(除数锁存寄存器)
第一:作用:U0DLL和U0DLM寄存器一起构成一个16位除数。
第三:U0DLL和U0DLM都为8位寄存器。
第四:U0DLL:存放分频值的低8位
第五:U0DLM:存放分频值的高8位。
注意:
(1)使用U0DLL和U0DLM配置波特率之前,必须先计算分频值。
Fdiv=Fpclk/(16*baud)
(2)使用U0DLL和U0DLM配置波特率之前必须把U0LCR控制寄存器的第8位置为1才能进行配置。配置完后要把U0LCR控制寄存器的第8位置位0。
2.串口接收数据
用轮循方式接收数据
1>CPU通过串口接收数据时各个寄存器之间的关系
2>串口接受数据的流程:
第一:循环检测U0RBR是否有未读取的数据。
第二:如果有数据到来,则接收数据。
3>相关寄存器配置
(1) U0LSR(线状态寄存器)
第一:作用,只读寄存器,它提供UART0发送和接收模块的状态信息。
第二:长度:8位寄存器。
第三:各位寄存器的含义:
A.0位:表示接收数据就绪
置0表示U0RBR为空
置1表示U0RBR包含有效数据
注:当U0RBR包含未读的字符时,第0位被置位;当UART0的U0RBR或FIFO为空时,第0位置零。
B.第1位:溢出错误。
置0:溢出错误状态未激活
置1:溢出错误状态激活
注:溢出错误条件在错误发生后立即设置。对U0LSR读操作将清零第1位。当UART0的RSR已经有新的字符就绪,而UART0 RBR或FIFO已满时,第一位置1.此时的UART0 RBR或FIFO不会被覆盖,UART0 的RSR中的字符将丢失。
C.第2位:奇偶错误。
置0:奇偶错误状态未激活
置1:奇偶错误状态激活
注:当接收字符的奇偶位处于错误状态时产生一个奇偶错误。对U0LSR读操作清零该位。奇偶错误检测时间取决于U0FCR的bit0。奇偶错误与UART0 的RBR,FIFO中读出的字符相关。
D.第3位:帧错误
置0:帧错误状态未激活。
置1:帧错误状态激活
注: 当接收字符的停止位为0时,产生帧错误。对读操作U0LSR清零该位。帧错误检测时间取决于U0FCR的bit0。帧错误与UART0的RBR,FIFO中读出的字符相关。当检测到一个帧错误时,Rx将尝试与数据重新同步并假设错误的停止位实际是一个超前的起始位。但即使没有出现帧错误,它也不能假设下一个接收到的字节是正确的。
E.第四位:间隔中断
置0:间隔中断状态未激活
置1:间隔中断状态状态激活
注: 在发送整个字符(起始位,数据,奇偶位和停止位)过程中RXD0如果都保持逻辑0,则产生间隔中断。当检测到中断条件时,接收器立即进入空闲状态直到RXD0变为全1状态。读操作U0LSR清零该状态位。 间隔检测的时间取决于U0FCR的bit0。间隔中断与UART0的RBR或FIFO中读出的字符相关。
F.第五位:发送保持寄存器空
置0:表示U0THR包含有效数据
置1:表示U0THR空
注:当检测到UART0 的THR空时,THRE置位。对U0THR写操作清零该位。
G.第6位:表示发送器空
置0:U0THR和或U0TSR包含有效数据。
置1:U0THR和U0TSR空
注:当U0THR和U0TSR都为空时,该位置1,当U0TSR或U0THR包含有效数据时,该位清零。
H第7位:表示Rx FIFO 错误。
置0:U0RBR中没有UART0 Rx错误,或U0FCR的bit为0.
置1:U0RBR包含至少一个UART0 Rx错误。
注: 当一个带有Rx错误(例如帧错误,奇偶错误或间隔中断)的字符装入U0RBR时,该位置1。 当读取U0LSR寄存器并且UART0的FIFO中不再有错误时,该位置零。
(2) U0RBR(接收器缓冲寄存器)
第一:作用,只读寄存器,是UART0 Rx FIFO的最高字节。它包含了最早接收到的字符,可通过总线接口读出。串口接收数据时低位在先,即U0RBR的bit0为最早接收到的数据位。如果接收到的数据小于8位,未使用的MSB填充为0.
第二:长度:8位寄存器。
3.串口发送数据
1> 用CPU通过串口发送数据时,各寄存器之间的关系
2> 串口发送数据时的流程
第一:将要发送的一字节数据写入U0THR
第二:等待数据发送完毕
3> 相关寄存器配置
(1)U0THR(发送保持寄存器)
第一:最用:只写寄存器。U0THR是UART0 Tx FIFO的最高字节。它包含了Tx FIFO 中最新的字符,可通过总线接口写入。串口发送数据时,低位在先,bit0代表最先发送的位。
长度:8位寄存器
(2)U0LSR(线状态寄存器)
在上面已经介绍,在此步再涉及。
4.下面是完整的程序:用轮训方式实现接收上位机数据,并把数据再发送给上位机。
(通过上位机给串口发送8字节数据,ARM2200接收到串口数据后,把数据又发送回上位机)
/****************************************************************************** ** Modified by: TIGER0-JOHN ** Modified date: 2011-1-21 ** Version: 1.1 ** Descriptions: 测试成功 ,在上面上发送16进制数时,每个之间用空格隔开 不加前缀 ****************************************************************************/ #include "config.h" /**************************************************************************** * 名 称: DelayNS() * 功 能: 长软件延时 * 入口参数: dly 延时参数,值越大,延时越久 * 出口参数: 无 ****************************************************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) { for(i=0; i<5000; i++); } } /********************************************************** * 名称: UART0_Init() * 功能: UART0初始化(通讯波特率115200,8位数据位, 1位停止位,无奇偶校验) * 入口参数: bps 串口波特率 * 出口参数: 无 **********************************************************/ void UART0_Init(uint32 bps) { uint16 Fdiv; PINSEL0 = 0x00000005; //设置串口引脚 U0LCR = 0x83; //置为除数锁存位,进行配置 Fdiv = (Fpclk >> 4) / bps; // 设置波特率 U0DLM = Fdiv >> 8; U0DLL = Fdiv & 0xff; U0LCR = 0x03; //清除除数锁存位,并设置工作模式 } /********************************************************** * 名 称: UART0_RcvByte * 功 能: 用查询方式接收一字节的数据 * 入口参数: 无 * 出口参数: data 要接收的数据 **********************************************************/ uint8 UART0_RcvByte(void) { uint8 rcv_data ; while((U0LSR&0X01)==0); //等待数据到达 rcv_data = U0RBR; //从U0RBR中读出接收到的数据 return rcv_data; //返回接收到的数据 } /********************************************************** * 名 称: UART0_SendByte * 功 能: 向串口发送字节数据,并等待发送完毕。 * 入口参数: data 要发送的数据 * 出口参数: 无 **********************************************************/ void UART0_SendByte(uint8 data) { U0THR = data; while(0 == (U0LSR & 0x40)); } /********************************************************** * 名称: UART0_RecBuf() * 功能: 接收串口发送过来的帧数据, * 入口参数: *buffer 存放一帧数据 * 出口参数: 无 **********************************************************/ void UART0_RecBuf (uint8 *buffer) { uint8 *pbuffer; uint8 i; for(pbuffer = buffer, i = 0;i < 8; i++) { *(pbuffer++) = UART0_RcvByte(); } } /********************************************************** * 名称: UART0_SendBuf() * 功能: 通过串口发送一帧数据 * 入口参数: *buffer 存放一帧数据 * 出口参数: 无 **********************************************************/ void UART0_SendBuf(uint8 *buffer) { uint8 *pbuffer; uint8 i; for(pbuffer = buffer,i=0;i < 8; i++) UART0_SendByte(*(pbuffer++)); } int main (void) { uint8 recver_buffer[8]; //定义接收帧缓冲区 uint8 send_buffer[8] ={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27}; //定义发送帧缓冲区 UART0_Init(115200); while(1) { UART0_RecBuf(recver_buffer); DelayNS(10); if(0x10 ==recver_buffer[0] && 0x11 == recver_buffer[1]) UART0_SendBuf(recver_buffer); else UART0_SendBuf(send_buffer); } return 0; }
下一节讲中断方式串口编程 -
【C#串口编程计划】串口编程简介
2017-03-08 12:48:27 -
python串口编程视频_串口编程(python串口通信实例)
2021-01-29 06:44:29串口编程是个什么东西?串口编程用于工业控制,PC侧可利用MSCOMM控件或WIN API函数操作串口(RS232口)与外设进行通信,命令外设执行某种操作,获取外设返回的数据,进行数据处理.我想通过串口调试助手给单片机发1-30...串口编程是个什么东西?
串口编程用于工业控制,PC侧可利用MSCOMM控件或WIN API函数操作串口(RS232口)与外设进行通信,命令外设执行某种操作,获取外设返回的数据,进行数据处理.
我想通过串口调试助手给单片机发1-30的数,然后在单片机里有一个数组存放.
1)一般的来说,要保证实时性(接收实时性以及发送的实时性),对串口操作采用多线程:一个线程负责接收;另一个线程负责发送。2)在 .net类库中 system.io.ports..
串口程序一般是指通过程序来使用计算机串口与外界通讯,vb/vc/delphi都有串口组件能简单进行串口编程。
面板上一个按钮,接下去后,电脑就从串口com1口出一个68H出去
是stdlib.h,而且用windows.h就行了
难道只是在和电脑串口相连的时候加上一个电平转换器MAX-232就表现的吗.
首先要进行串口的初始化,也就是设置波特率发生器(定时器1)的th1和tl1,tmod为20h,scon为50h等,串口程序就是在一定的时序下把单片机内的数据发送出去,或者把数.
请简要说明串行口工作原理和编程原理以及结论。谢谢啊各位大侠,懂的来解。
1.串行口工作原理 微机串行通信采用EIA RS-232C标准,为单向不平衡传输方式,. 8250 UART共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读/写操.
现在已经写出来了一部分可以读取一个串口的……但是多个的就不是特别会….
要给不同的串口分配ID号,,根据ID号去连接串口端~~~ 若要做多机通讯,,最好使用RS485~~~
下载个单片机小精灵吧,可以直接生产单片机串口程序这是一个11.0592M晶振9600波特率的串口程序#include void InitUART(void){ TMOD = 0x20; SCON = 0x50; TH1 = 0.
有蓝牙串口, 也有usb串口, 就是用来读取数据的啊, 例如otg通信中, 就是通过usb串口来通信的, 蓝牙的话就是通过无线来通信.
哪位大神,指引小弟一下,有没有什么比较通用的方法找到com口对其进行操.
#include #include #include #define true 1 main( ) { char ch;int i; char a[50]; clrscr(); for(i=0;i<50;i++) { a[i]='a'+i; } i=0; outportb(0x3fb,0x80); outportb.
谁能给一个最简单的串口接收程序 要c语言 不用定时器终端 做到输入一个数(。
#include /*****************************************************函数功能:接收一个字节数据. //SCON=0101 0000B,串口工作方式1,允许接收(REN=1) PCON=0x00; //PCON=.
刚找了份工作,却做c++串口编程,这个没接触过。。买了本铁道出版社的《。
给你点代码void Com::init_com_interface(){ hcom = CreateFile("COM1", // . //} //else return TRUE;}以上是串口初始化代码以下是发送字符串代码void Com::.
你好,请问会用C语言读取PLC里的数据吗
只要你能把数据送出来,就肯定能读到。比如送到串口 再看看别人怎么说的。
PS:我是外行,麻烦说具体一点什么叫做串口,也帮我解释一下吧
就是将写好的程序编译好形成HEX或BIN文件后,将这个程序写进单片机芯片的过程. 这样也好,可以特指PC向MCU写入程序。免得和单片机工作时串口的上传和下次数据.
TMOD=0x20; TH1=0xFD; TL1=0xFD; SCON =0x50; PCON&=0xef; TR1=1; IE=。
TMOD=0x20; 定时器方式 TH1=0xFD; 给定时器赋值 TL1=0xFD; 给定时器赋值 SCON =0x50; 串口设置 PCON&=0xef; 是否倍频 TR1=1; 开启定时 IE=0x0; 关闭中.
interrupt 4{ SBUF=txt[i++]; } 就是想用串口在电脑上显示,hello,但是就是乱。
试试下列程序,这时用中断发送的。#include<reg51.h>#define uchar unsigned . TI = 0;} }本程序,可以用串口助手接收。收到的是:hellohellohellohellohello..
用vc++编程实现GPS数据的串口接收,用API或MSComm均可,希望提供源程。
例程1 打开VC++6.0,新建基于对话框的工程RS485Comm,在主对话框窗口IDD_. 添加一个静态文本框IDC_DISP,用于显示串口接收到的内容。在RS485CommDlg.cpp.
用什么语言?什么开发工具?主要做串口的通信编程吗?不懂的别来回答了,。
如果是新手, 就用vb6, mscomm控件编程比较简单. 想多学些, 就用c#吧. 网上有一个高手写了几篇C#串口操作,包括通讯协议分析的文章. 很是到位!
我现在通过串口调试助手发送指令必须带着回车,然后接收信息的时候read返。
你好楼主,前一阵正好研究了一下linux串口编程,苦恼了一阵,不过总算弄通了,下面说一下我的思路和理解。struct termios state; 这是一个设计到串口属性的结构体,.
flag=1;}哪错了啊?为什么我通过串口调试助手发送的时候显示的是乱码呢
void main(){ SCON = 0x50; TMOD = 0x20; //设置定时器1为工作方式2 TH1 = 0xf4; TL1 = 0xf4; TR1 = 1; EA = 1; ES = 1; while(1) { if(flag) { flag = 0; //不关闭串口中断,要让.
-
C#串口编程之串口助手
2019-08-06 23:56:25这是一个C#串口编程的入门级程序,可以实现简单的数据发送和接收,大家可以下载下来之后学习一下,因为主要是为了演示串口编程,所以程序中很多可能发生异常的地方没有添加try和catch语句。 -
QT5串口编程——编写简单的上位机
2016-01-30 15:51:48注:更新自2018年12月13日(我回看了一年多前写的这篇...学习了前面部分,对QT有了大概的了解后,就开始在网上寻找串口编程的方法。通过好几天的学习,终于写出了一个用于串口通信的上位机。下面开始介绍串口类的... -
rxtx串口编程
2017-05-08 13:52:36rxtx.jar包,串口编程工具包 -
java串口编程实例_Java串口编程例子
2021-02-26 15:51:11最近笔者接触到串口编程,网上搜了些资料,顺便整理一下。网上都在推荐使用Java RXTX开源类库,它提供了Windows、Linux等不同操作系统下的串口和并口通信实现,遵循GNU LGPL协议。看起来不错,写个例子试试。准备...
-
零基础极简以太坊智能合约开发环境搭建并开发部署
-
一天学完MySQL数据库
-
Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100)
-
龙芯生态应用开发基础:C语言精要
-
714. 买卖股票的最佳时机含手续费
-
linux c 通过http 协议 ,上传文件到服务器 源码
-
清华大学历年考研复试机试真题 - 等差数列
-
linux c 通过FTP 协议上传文件 源码 亲测可用
-
投标方法论
-
Win10 Dolby Atmos Speaker System 杜比全景声(Dolby Atmos)扬声器系统.zip
-
MySQL 事务和锁
-
linux c i2c总线 通信 源代码
-
Go垃圾收集器
-
数据结构实践准备
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
IT安全风险评估管理指南_V1.0.doc
-
PAT甲级-排序类型-1016 Phone Bills解题思路
-
51单片机交通灯设计.rar
-
2013-2020矩阵代数往年试题.zip
-
西门子 电气设备选型资料大全 (适合刚刚入行的电气工程师对设备进行选型规划)详解 报价