-
串口通讯
2017-03-21 01:42:20模拟一个串口通讯: 1)读取串口中的数据 2)可以根据您自己的产品协议,向串口中发送数据 实例Demo 可参考另外的一个串口通讯的Demo:JNI集成串口通讯的Demo根据您的协议更改一下Demo中的串口名称和波特率: /*...模拟一个串口通讯:
1)读取串口中的数据
2)可以根据您自己的产品协议,向串口中发送数据
实例Demo
可参考另外的一个串口通讯的Demo:JNI集成串口通讯的Demo根据您的协议更改一下Demo中的串口名称和波特率:
/** * 串口名称 */ private String PATH = "/dev/ttyS4"; /** * 波特率 */ private int BAUDRATE = 9600;
开一个子线程不断读取川口中的数据,有数据就处理自己的逻辑:
private class ReadThreadBox extends Thread { @Override public void run() { super.run(); while (boxFlag) { int size; try { byte[] buffer = new byte[64]; if (mInputStreamBox == null) return; /* read会一直等待数据,如果要判断是否接受完成,只有设置结束标识,或作其他特殊的处理 */ size = mInputStreamBox.read(buffer); if (size > 0) { Log.e(TAG, "run: buffer:"+buffer.toString()+" "); sportInterface.onLockerDataReceived(buffer, size,path); String mHTStr=mHexsToString(buffer,buffer.length); } } catch (IOException e) { e.printStackTrace(); return; } //Log.i("SerialPort","read end"); } } }
-
串口通讯模块C# 串口通讯模块C#
2010-11-28 18:24:52串口通讯模块C串口串口通讯模块C#通串口通讯模块C#讯模块C##串口通讯模块C# -
STM32—串口通讯详解
2019-07-30 22:26:34串口通讯目录物理层协议层USART简介代码讲解 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。物理层...串口通讯目录
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。物理层规定通信协议中具有机械、电子功能的特性,从而确保原始数据在物理媒体的传播;协议层主要规定通讯逻辑,统一双方的数据打包、解包标准。通俗的讲物理层规定我们用嘴巴还是肢体交流,协议层规定我们用中文还是英文交流。下面分析一下串口通讯协议的物理层和协议层。
物理层
1.通讯结构
串口通讯的物理层的主要标准是RS-232标准,其规定了信号的用途、通讯接口及信号的电平标准,其通讯结构如下:
在设备内部信号是以TTL电平标准传输的,设备之间是通过RS-232电平标准传输的,而且TTL电平需要经过电平转换芯片才能转化为RS-232电平,RS-232电平转TTL电平也是如此。
2.电平标准
根据使用的电平标准不同,串口通讯可分为 RS-232标准 及TTL标准,具体标准如下:
在电子电路中常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MA3232芯片对TTL电平及RS-232电平进行相互转换。协议层
1.数据包
串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。
2.波特率
由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。
3.起始和停止信号
数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻辑0的数据位表示,停止位信号可由0.5、1、1.5、2个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。
4.有效数据
有效数据规定了主题数据的长度,一般为8或9位,其在STM32中也是通过串口初始化结构体来实现的。
5.数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无(noparity)。这些也都可以在串口初始化结构体中实现的。USART简介
USART(通用同步异步收发器)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。
STM32中一共有5个USART,如示:
USART的USB转串口原理图如下:
USART1的发送和接收端口是事先连接好的,如果要使用其他USART只需要将相应的发送接收端口按图连接好即可。
USART有多个中断请求事件:
开发板与上位机的连接
开发板与上位机之间通过USB线连接,所以在上位机上要配置一个USB转串口 的驱动,以便把USB传输过来的电平转换为TTL电平,TTL电平才能与串口调试助手建立联系。一般使用CH341驱动作为win10下的USB转串口,驱动安装成功的情况下接入USB会在计算机的设备管理器的端口中发现串口:
(win7系统一般选择CH340作为USB转串口驱动。)代码讲解:
固件库编程的一大好处就是我们可以根据固件库函数来学习外设的相关知识,而且固件库函数的编写都是建立在对底层寄存器操作上的,所以通过讲解代码可以更好理解串口通讯相关知识。
一.初始化结构体
typedef struct { uint32_t USART_BaudRate; // 波特率 uint16_t USART_WordLength; // 字长 uint16_t USART_StopBits; // 停止位 uint16_t USART_Parity; // 校验位 uint16_t USART_Mode; // USART 模式 uint16_t USART_HardwareFlowControl; // 硬件流控制 } USART_InitTypeDef;
USART初始化结构体中的相应变量都对应着数据包中的相对内容。
二.NVIC配置中断优先级
我们在串口接收信息时采用了触发中断事件,所以要配置一下串口中断的优先级:
NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置USART为中断源 */ NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ; /* 抢断优先级*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); }
中断相关的知识之前详细讲过,此处就不再累赘讲述。
中断知识链接三.USART配置函数讲解
USART配置函数的主要作用是打开串口与相应的GPIO引脚,配置好相应串口信息与GPIO引脚的工作模式,以便信息的传输与接收。
void DEBUG_USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 第一步:初始化GPIO */ // 打开串口GPIO的时钟 DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE); // 将USART Tx的GPIO配置为推挽复用模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure); // 将USART Rx的GPIO配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure); /* 第二步:配置串口的初始化结构体 */ // 打开串口外设的时钟 DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE); // 配置串口的工作参数 // 配置波特率 USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE; // 配置 针数据字长 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 配置停止位 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 配置校验位 USART_InitStructure.USART_Parity = USART_Parity_No ; // 配置硬件流控制 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 配置工作模式,收发一起 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 完成串口的初始化配置 USART_Init(DEBUG_USARTx, &USART_InitStructure); /*--------------------------------------------------------*/ // 串口中断优先级配置 NVIC_Configuration(); // 使能串口接收中断 USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); /*--------------------------------------------------------*/ /* 第三步:使能串口 */ // 使能串口 USART_Cmd(DEBUG_USARTx, ENABLE); }
第一步:打开了GPIO的时钟,设置发送和接收引脚的信息,将Tx(发送引脚)配置为推挽复用模式用来发送数据,Rx(接收引脚)配置为浮空输入模式用来接收数据。
第二步:首先打开USART1 的时钟,根据USART初始化结构体成员配置相关的信息,之后利用初始化函数将初始化结构体中的信息写入相应寄存器中,然后的话就是引用NVIC_Configuration()
函数配置串口中断优先级,打开相应的串口接收中断,中断接收函数的参数如下:
第三步 :最后相当于打开总电源——使能串口USART配置函数完成后代表,USART1 的接收和发送准备工作已经准备就绪,接下来就是,串口与上位机之间的信息传递了,信息的发送和接收都有相对于的函数。
四.传输数据的函数:
开发板与上位机之间的数据传输可以有多种方法,下面一一介绍:
1.发送一个字节
以USART_SendData(pUSARTx,ch); 函数为基础建立的函数可以向上位机发送一个字节的数据,利用FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG) 读取发送数据寄存器的状态来 等待发送寄存器将数据成功发送。
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch) { /* 发送一个字节数据到USART */ USART_SendData(pUSARTx,ch); /* 等待发送数据寄存器为空 */ while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); }
2.发送字符串
本质是利用上面的字节发送函数逐位发送字符串中的内容
void USART_SendString(USART_TypeDef * pUSARTx, char *str) { unsigned int k=0; while(*(str+k)!='\0') { USART_SendData(pUSARTx, *(str+k)); /* 等待发送数据寄存器为空 */ while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET); k++; } while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET); /* TC:传输完成标志 */ }
3.重定向printf函数发送字符串
关于重定向的知识之前总结过,链接:重定向知识。重定向后的
printf()
函数功能强大,具有向串口调试助手打印数据的功能,使用方法和c语言时一样,比如printf("欢迎来到小全全的串口实验\n");
就可以将“欢迎来到小全全的串口实验”这句话发送到上位机中,而且换行符“\n”还具有换行作用。/* 重定向printf函数 */ int fputc(int ch, FILE *f) { USART_SendData( DEBUG_USARTx, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); return ch; }
4.重定向getchar函数接收字符
具体操作与重定向后的printf函数类似,比如可以通过如下代码向上位机发送已经接收到的数据:
x=getchar(); printf("接收到的字符是:%c\n",x);
重定义如下:
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数 int fgetc(FILE *f) { /* 等待串口输入数据 */ while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(DEBUG_USARTx); }
在使用此函数作为接收数据时记得关闭串口得接收中断!!!
5.通过中断接收
在
stm32f10x_it.c
中编写USART1中断源相对应得中断函数,利用了固件库函数中的
USART_ReceiveData(DEBUG_USARTx);接收函数
USART_SendData(DEBUG_USARTx, x);发送函数
USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE);判断标志位函数/* #define DEBUG_USART_IRQn USART1_IRQn #define DEBUG_USART_IRQHandler USART1_IRQHandler */ void DEBUG_USART_IRQHandler(void) { uint16_t x; /* 判断是否收到中断信号 */ if(USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE) == SET) { x = USART_ReceiveData(DEBUG_USARTx); USART_SendData(DEBUG_USARTx, x); } }
结语
以固件库函数编程的思路讲解,未能顾及到众多寄存器的讲解,我认为进行固件库编程本身就是学习操作寄存器的过程,很多时候我们不需要知道如何操作寄存器,只要了解如何操作固件库函数即可。(吹爆固件库编程)
-
s7300plc串口通信_什么是串口通讯?plc串口通讯的使用
2020-12-22 09:25:44什么是串口通讯?plc串口通讯的使用串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议...什么是串口通讯?plc串口通讯的使用
串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS- 232口。同时,串口通信协议也可以用于获取远程采集设备的数据。
2,串口通讯的使用
串口通讯使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:
a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通讯。
b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、
7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或传输和接受的数据不同步。
-
delphi MSCOMM 串口通讯
2020-08-17 11:59:35dephi 串口通讯开发组件,压缩包有安装说明,适合任何串口通讯取数,称重仪等硬件必须用串口线连接。 -
c# 串口通讯和TCP通讯
2018-08-15 11:21:40c# 串口通讯和TCP通讯。用途是根据串口通讯获得一起的准确数据,然后根据tcp发布出去,已经验证 -
VB串口通讯USB通讯
2015-04-17 10:46:10VB串口通讯USB通讯 -
Java使用开源Rxtx实现串口通讯 串口开发
2014-04-13 15:48:48Java使用开源Rxtx实现串口通讯 串口开发,里面包含实例,下载后按自己的要求进行修改即可(仅限对java有基础的人员)。 -
Android 串口通讯
2018-03-22 11:35:57Android 串口通讯示例Demo!对原生的串口进行封装,打开,读写,关闭串口进行了封装! -
C#串口通讯
2018-06-14 17:48:46用C#做的上位机 用于串口通讯,方便的与下位机进行通讯 -
串口通讯Demo
2017-03-21 01:30:55串口通讯【获取串口中的数据、向串口中发送数据】 -
串口通讯demo
2018-11-06 15:04:57RXTXcomm + spring swing实现串口通讯 。完整代码 含对应包 -
DELPHI串口通讯测试
2020-01-31 10:18:38一个全面的DELPHI串口通讯软件,内有多个实例,包括传输数据、串口组件、二级管测试、数字输入、通信事件、线程处理、自动通讯以及多个专题范例,基全包含了DELPHI串口通讯的基本方法与实例,是编写DELPHI串口通讯... -
串口通讯协议性串口通讯模块(C#原创)
2011-05-12 18:04:55串口通讯串口通讯协议性串口通讯模块(C#原创) -
javaWeb调用串口通讯
2020-08-10 09:51:52java串口通讯demo源码,内有注解。可实现通过javaWeb页面控制串口,调用串口数据,发送串口指令等操作。可同时监听多个串口,并同时向多个串口发送和接收消息。内含已经写好的串口监听类,定时器,以及串口数据转换... -
串口通讯简单例子
2019-12-04 04:31:28简单的串口通讯例子 -
串口通讯MODBUS通讯协议例子
2018-05-30 23:26:02Visual C++串口通讯MODBUS通讯协议例子,希望对大家有用。 -
PB串口通讯例子
2016-04-18 21:00:38PB串口通讯例子 PB串口通讯例子 PB串口通讯例子 -
串口通讯资源ppt
2019-01-03 09:34:17对串口通讯分析,什么是串口通讯 什么是RS232,485,什么是半双工 -
VS串口通讯
2018-08-25 21:55:42VS2015串口通讯 开发一个简单的上位机界面程序,实现上位机与下位机串口通信,从而对下位机进行程序升级。 win10系统; VS2015社区版(免费);Comm -
C#串口通讯和socket通讯demo
2020-10-20 17:14:59demo包含串口通讯和socket通讯,用的Serialport类和socket类,socket demo即可当客户端又可当服务端 -
Labview串口通讯实例
2018-12-29 11:32:25Labview串口通讯实例,可以直接运行,主要简单的演示LABVIEW的串口如何编写,可以与串口调试助手通过虚拟串口直接通讯。 -
opencv+串口通讯
2018-07-11 10:28:10基于opencv的串口通讯程序,简单,可以很容易理解,对串口通讯的简单使用 -
LabVIEW串口通讯.vi
2020-06-08 20:26:46实现了LabVIEW串口通讯,可用于LabVIEW与嵌入式系统的串口通讯。
-
Unity游戏开发之数字华容道
-
单片机完全学习课程全五季套餐
-
Spring Cloud OAuth2案例
-
彻底学会正则表达式
-
vs2010用mfc 自动获取串口列表并且实现收发数据
-
Win10无法调节亮度解决方法
-
iphone苹果手机越狱绕ID助手Sliver最新版
-
PCI Express IP核应用参考设计.7z
-
图片压缩(java)将图片压缩后以二进制的形式输出
-
B站视频倍速播放
-
Excel高级图表技巧
-
pyechart数据可视化
-
PCI的核.7zPCI的核.7z
-
JavaEE框架(Maven+SSM)全程实战开发教程(源码+讲义)
-
solidity 重入攻击测试
-
Vue Echart的渲染和使用
-
2021最新Kubernetes(k8s)集群实战精讲
-
一套真正能用的delphi开发的三层大型系统源码
-
国家注册信息安全工程师体系课程(CISP-PTE)
-
《C++Primer》9.49