精华内容
下载资源
问答
  • 串口通信错误如何解决
    2022-02-19 10:13:59

    以下以AVR单片机为例,使用内部RC振荡器8MHz系统时钟频率,上位机与单片机通讯出现问题:

    首先分析原因:

    1. 出于成本考虑没有使用外部晶振而是RC内部振荡器,精度较差,误差范围是标称值的±3%,而且系统振荡频率随温度的不同也会有一定的变化,因此根据标称的系统时钟频率来计算波特率就会产生相应的误差。

    2. 当设置系统时钟为8MHz时,波特率一般都是习惯性的设置为9600、19200,115200等300的倍数,计算结果会有一定的误差。

    例如波特率设置为9600,根据计算公式:

    UBRRL=(FOSC/BAUD1/16-1)%256;

    UBRRH=(FOSC/BAUD1/16-1)/256;

    经计算得到的波特率寄存器初值UBRRH=0,UBRRL=51(实际值为51.083),就有一定的误差。用51反推波特率的数值为9615,误差率为0.16%,虽然不是很大,但是如果数据连续发送量较大则会有累计误差导致错码。

    解决办法:

    1. 能使用外部晶振当然是最好的解决办法。

    2. 在使用内部RC振荡器的情况下:

    1)使用官方给的方法对内部RC进行校准。

    2)波特率的设置不一定要设置为9600等常用数值,而是针对8MHz计算能得到波特率寄存器数值为整数,这样就不存在取整导致的误差。

    例如将波特率设置为10000,计算所得UBRRH=0,UBRRL=49,波特率寄存器的值刚好是整数,避免了取整误差。

    上位机波特率也调整为10000,

    3)避免一次发送大量数据,避免累计误差。

    4)上位机可以用查询的方式来确定当前温度适用的波特率,例如可以设定9600±200Hz范围,每50Hz为一个步进给下位机发送一个多字节信号,并且发送多次,以是否每次都能收到下位机正常反馈信号为判断依据来决定当前的上位机波特率。

    本人在使用方法2)和3)就使得问题有了明显改善。波特率调整到20000也能正常通讯,调整到50000失败。

    更多相关内容
  • USB转串口驱动下载 win7 64位旗舰版安装pl2303 USB转串口安装成功,但使用时出现“运行时错误8020 读comm设备错误” 程序闪退 解决办法 下载安装USB转串口驱动
  • 在调试FreeRTOS系统时,在串口中断中用队列存储数据,然后再定时器中断中用队列接收数据,并通过串口打印出来。在调试代码中编译器报错。 在网上搜索之后,找到了一个解决方法。在usart.c文件中添加以下代码,...

    在调试FreeRTOS系统时,在串口中断中用队列存储数据,然后再定时器中断中用队列接收数据,并通过串口打印出来。在调试代码中编译器报错。
    …\OBJ\LED.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced
    在这里插入图片描述
    在网上搜索之后,找到了一个解决方法。在usart.c文件中添加以下代码,可以解决这个问题。

    //__use_no_semihosting was requested, but _ttywrch was
    _ttywrch(int ch)
    {
        ch = ch;
    }
    

    在这里插入图片描述
    然后通过对比正点原子的代码,发现了另一个解决方法。在usart.c文件中直接屏蔽

    #pragma import(__use_no_semihosting)
    

    这行代码,也可以解决这个问题。
    在这里插入图片描述

    展开全文
  • 学习笔记:串口通信的概念以及编写...错误解决方法!这两天在读《嵌入式C语言的自我修养》懂了很多知识,尤其是汇编和C的函数调用,这在学习串口进行通信的时候也用到了C语言调用汇编函数和NVIC中断程序的编写。 ...

    系列文章目录

    学习笔记:串口通信的概念以及编写程序实现串口通信。
    遇到的…\OBJ\Project.axf: Error: L6200E: Symbol USART1_IRQHandler multiply defined (by usart.o and main.o).错误解决方法!



    前言

    这两天在读《嵌入式C语言的自我修养》懂了很多知识,尤其是汇编和C的函数调用,这在学习串口进行通信的时候也用到了C语言调用汇编函数和NVIC中断程序的编写。
    下面是我对知识的总结还有如何编写串口通信程序和NVIC中断程序的步骤(主要是参考了正点原子的参考手册)。


    一、串口通信的基础知识

    1.处理器与外部设备通信的两种方式:

    并行通信
    -传输原理:数据各个位同时传输。
    -优点:速度快
    -缺点:占用引脚资源多
    串行通信
    -传输原理:数据按位顺序传输。
    -优点:占用引脚资源少
    -缺点:速度相对较慢

    1.1串行通信

    按照数据传送方向,分为:
    单工:
    数据传输只支持数据在一个方向上传输。
    半双工:
    允许数据在两个方向上传输,但是,在某一时刻,只允许数
    据在一个方向上传输,它实际上是一种切换方向的单工通信;
    全双工:
    允许数据同时在两个方向上传输,因此,全双工通信是两个
    单工通信方式的结合,它要求发送设备和接收设备都有独立
    的接收和发送能力。
    串行通信三种传送方式:
    在这里插入图片描述

    1.2串行通信的通信方式

    同步通信带时钟同步信号传输。
    -SPI,IIC通信接口;
    异步通信不带时钟同步信号。
    -UART(通用异步收发器),单总线;

    2.常见的串行通信接口

    通信标准引脚说明通信方式通信方向
    UART(通用异步收发器)TXD:发送端;RXD:接受端;GND:公共地异步通信全双工
    单总线(1-wire)DQ:发送/接受端异步通信半双工
    SPISCK:同步时钟;MISO:主机输入,从机输出;MOSI:主机输出,从机输入同步通信全双工
    IICSCL:同步时钟;SDA:数据输入/输出端同步通信半双工

    2.1、STM32的串口通信接口

    UART:通用异步收发器;
    USART:通用同步异步收发器;

    2.2、UART异步通信方式引脚连接方法:

    -RXD:数据输入引脚。数据接收
    -TXD:数据发送引脚。数据发送。

    在这里插入图片描述

    在这里插入图片描述

    2.3、UART异步通信方式特点:

    • 全双工异步通信。
    • 分数波特率发生器系统,提供精确的波特率。
      -发送和接受共用的可编程波特率,最高可达4.5Mbits/s
    • 可编程的数据字长度(8位或者9位);
    • 可配置的停止位(支持1或者2位停止位);
    • 可配置的使用DMA多缓冲器通信。
    • 单独的发送器和接收器使能位。
    • 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志
    • 多个带标志的中断源。触发中断。
    • 其他:校验控制,四个错误检测标志。

    3.STM32串口异步通信需要定义的参数

    • 起始位
    • 数据位(8位或者9位)
    • 奇偶校验位(第9位)
    • 停止位(1,15,2位)
    • 波特率设置
      USART框图
      在这里插入图片描述

    二、程序编写

    1.编写步骤

    1.串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
    2.串口复位:USART_DeInit(); 这一步不是必须的
    3.GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP
    4. 串口参数初始化:USART_Init();
    5.开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
    NVIC_Init();
    == USART_ITConfig();==
    6.使能串口:USART_Cmd();
    7.编写中断处理函数:USARTx_IRQHandler();
    8.串口数据收发:
    void USART_SendData();//发送数据到串口,DR
    uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
    9.串口传输状态获取:
    FlagStatus USART_GetFlagStatus
    (USART_TypeDef* USARTx, uint16_t USART_FLAG);
    void USART_ClearITPendingBit
    (USART_TypeDef* USARTx, uint16_t USART_IT);

    2.程序实例

    代码如下(所示):

    #include "stm32f10x.h"
    
    void Bitter_USART_Init(void)
    {
    		GPIO_InitTypeDef GPIO_InitStruct;
    		USART_InitTypeDef USART_InitStruct;
    		NVIC_InitTypeDef NVIC_InitStruct;
    	
    		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA
    		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口一
    	
    		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
    		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
    		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
    		GPIO_Init(GPIOA,&GPIO_InitStruct);
    	
    		GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    		GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
    		GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
    		GPIO_Init(GPIOA,&GPIO_InitStruct);
    		
    		USART_InitStruct.USART_BaudRate=115200;//波特率
    		USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
    		USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//发送和接收
    		USART_InitStruct.USART_Parity=USART_Parity_No;//奇偶校验
    		USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位
    		USART_InitStruct.USART_WordLength=USART_WordLength_8b;//字长
    	
    		USART_Init(USART1,&USART_InitStruct);//串口初始化
    		USART_Cmd(USART1,ENABLE);//串口使能函数
    		
    		USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启中断服务函数;接收中断
    		
    		NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;//中断通道
    		NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//开启中断通道
    		NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级
    		NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级
    		
    		NVIC_Init(&NVIC_InitStruct);
    }
    
    void USART1_IRQHandler(void)
    {
    		u8 tea;
    		if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断中断类型
    		{
    				tea=USART_ReceiveData(USART1);//读取串口一接收到的数据;
    				USART_SendData(USART1,tea);//发送数据
    		}
    }
    
    int main(void)
    {
    		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级,两位抢占优先级,两位响应优先级
    		Bitter_USART_Init();
    		while(1);
    }
    

    三、…\OBJ\Project.axf: Error: L6200E: Symbol USART1_IRQHandler multiply defined (by usart.o and main.o).错误解决方法

    usart.c中找到和USART1_IRQHandler一样的函数,注释掉就可以了。


    总结

    编写串口还可以使用 HAL 库实现串口配置和使用的方法。。在 HAL 库中,串口相关的函数和定义主要在文件 stm32f1xx_hal_uart.cstm32f1xx_hal_uart.h 中。

    展开全文
  • 我用的是串口通信来控制,比如有缺陷,向arduino发送一个字符,arduino收到后判断一下就好,然后给引脚高电平,灯就亮了。 很简单的原理,但我这个小白就在一环上卡住了,就是,理论上程序什么的逻辑都,没有问题...

    最近在学labview,其实去年就有接触,做了一个arduino做下位机,labview做上位机带温湿度传感器的小东西,功能很简单,labview上位机编程很容易,在VI package manager 上下载labview interface for arduino,强烈推荐使用labview2013,我用的就是,各种工具包很全,在官网上都能找到。这个LIFA(labview interface for arduino)里面已经有了读取传感器数据的函数了,在网上搜一下arduino labview简易温度计就行,分别写好上位机也就是labview程序,和arduino程序,串口什么的配置好,就能正常工作了,是一个新手上手非常快,很有成就感的小项目。

    我的重点不在这里,最近做的是一个图像处理和识别的labview程序,想要加一些硬件部分的东西,因此就想到了闲置多年的arduino,我用的是arduino uno 淘宝上小100买的整盒套件,里面的配件和资料都很全,推荐买这样的,方便了不止一丢丢。我要实现的功能很简单,就是有缺陷的时候就亮红灯,没有的就亮绿灯。首先,上位机程序写好,就是判断图像缺陷的部分,结果是一个布尔量。原理很简单,就是通过判断这个布尔量来控制灯亮。我用的是串口通信来控制,比如有缺陷,向arduino发送一个字符,arduino收到后判断一下就好,然后给引脚高电平,灯就亮了。

    很简单的原理,但我这个小白就在一环上卡住了,就是,理论上程序什么的逻辑都,没有问题,但灯就是不亮,搞得我心烦了一天。我有一本参考书感觉特别好,叫《arduino与labview开发实战》,里面有类似这个的一个例程,我把例程做了一遍,完全没有问题。但是回到我这个程序,没有像书上那么复杂的结构,又是case structure又是do-while循环的,就是不能让灯亮。怎么办,调试!!!

    首先,要确保labview真的按照你的约定,发了相应的字符,怎么办?用虚拟串口。我用的创建虚拟串口的软件是configure virtual serial port driver,一创建创建的是一对串口,比如COM1和COM2,这有什么用的,你往串口1发的,串口2能接收到,反之亦然,为什么要这样调试,因为串口是独占设备,你不可能用labview使用一个串口发数据的同时,另一个程序监视串口发了什么。

    所以,我的调试就是往COM1发数据,用串口调试助手查看COM2数据。注意使用串口助手注意选择是ASCII还是hex。

    这没问题之后,我又用arduino的串口调试助手向arduino发数据,发现灯也能正常亮,但是labview和arduino联调,就!是!不!亮!!!!!!

    偶然间,我发现,labview高亮调试的时候,灯可以亮,我以为是因为在灯亮的那个延时,arduino给的延时太短,或者labview延时太短,导致一闪而灭,后来发现,不是这样的。然后,我就上网查,程序高亮正常执行但是普通执行不对,给出的回答是时间的问题。

    后来就是各种尝试了。最后的最后,是因为labview编程,在串口初始化后要加一段时间的延时在发送字符!!切记啊亲们,我试出来的是,至少1600ms才可以,大家也可以自己试试。


    总结:串口初始化后要延时一段时间

                会用局部变量

               复习了子VI的编写和使用

               程序高亮能行 正常执行却不行的解决方法

               ASCII和hex区别,没选好可能会啥都不显示,比如接到0x01要是ASCII模式就啥都不会显示,因为不对应字符

               最后就是,遇到问题不要方啊,方了就不美了


    附上终于调通的程序,很简单,但是作为一只笨鸟,有点挑战性




    展开全文
  • 最近在英伟达开发板上进行串口编程,发现了一个奇怪的问题,自己用C写的串口程序读取的数据会错乱。后来偶然间发现,先用minicom串口助手打开串口,再运行自己写的串口读写程序,读取的数据就正常了。利用stty -a &...
  • 1通信线路的绝缘设计方法  RS-232的大噪声(干扰)容限可使接口可靠工作,避免对由外部加到导线上的噪声引起的数据错误。在一个充满了电子噪声的连接环境中,绝缘可以防止噪声在连接电路之间的耦合。绝缘通过将...
  • 使用软件串口,关闭硬件串口,调试与pc串口助手的串口通信4.通信测试:调用wiringPI库函数编写向pc调试助手循环发送数据"hello world"的程序:5.解决4中报错6.写在最后 1.开篇简单介绍 使用设备情况: Raspberry Pi ...
  • 串口通讯中出现的错误(1)

    千次阅读 2018-04-17 22:11:00
    问题1: 在做串口接收接收中断时,有这么一个现象,当接收到数据后,进入中断,如果再次发送的话,就进不去中断了,并且程序阻塞住了?为什么呢 源码如下: 原因如下:在数据寄存器和数据总线之间有一个移位...
  • 用mscomm控件编写串口通信过程中,在消息响应函数OnComm函数下接受串口发送过来的数据时,在get_Input()函数会出现error reading comm devece 错误。具体代码如下: void XXXDlg::OnCommMscommLaser() { memset...
  • QT开发的串口代码,解决串口接收数据分包或者不完整的问题
  • 通常单片机只提供一个异步串行通信接口(SCI)。因此,上述两种情况下,都涉及串行接口的扩展问题。以下将针对点对多点通信的串口扩展,给出一种使用最新串口扩展接口器件GM8123的解决方案。 2 点对多点通信的硬件...
  • 从终端向串口助手发送数据后,提示段错误: 原因: 可能是数组越界 例子: int main(int argc,char *argv[]) { int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); printf("socket=%d\n",sockfd); struct...
  • 摘要:介绍了异步通信芯片16C552的功能、特点、结构和内部寄存器,给出了用16C552芯片实现PC机与DSP串行通讯的方法,同时给出了它们之间的硬件接口电路和软件初始化程序。 关键词:16C552;串行通讯;异步当实现PC...
  • 如何排查串口通信问题?

    千次阅读 2022-04-07 11:04:23
    传输来源:公众号【鱼鹰谈单片机】作者:鱼鹰OspreyID :emOsprey工作过程中,总是会遇到各种各样的通信问题,除了掌握软件知识,必要的硬件技能也必不可少,...在此,以串口通信为例,介绍排查步骤或方向:红色代表...
  • 串口遇到错误

    2021-05-08 15:27:58
    1、错误描述 >>> int(67,8); Traceback (most recent call last): File "<pyshell#172>", line 1, in <module> int(67,8); TypeError: int() can't convert non-string with explic
  • 串口通信协议 串口通信协议 ——多机通信 串口通信属于全双工 软件和硬件我们都是模块化的思想 串口通信协议 全双工和半双工的区别: 全双工:好比 男和女的在互骂,两个声音都听的到。 半双工:好比 男和女的在...
  • 基于Unity串口通信解决方案

    万次阅读 多人点赞 2016-11-07 22:24:16
    一、简介1、几个月前我发布过一篇关于Unity的串口通信问题,只是阐述了问题,但是没有什么好的解决方案。经过我几个对串口相关的Unity项目开发,也发现了几种解决方案。开发中遇到的一些问题都详细的描述出来。 2、...
  • ​ ​解决方式一:将Unity串口通信数据模块(接收与发送),用C++来实现,这是最佳最好的解决方式。(最佳) ​解决方式二:用一个中间介程序去实现,Unity串口通信模块通过Socket发送给中介程序,中介程序在通过...
  • 串口通信编程

    千次阅读 2021-07-18 20:23:45
    串口通信学习笔记
  • 串口通信异常

    千次阅读 2020-06-01 17:52:24
    1、串口通信异常 问题现象:上位机下发数据正常。下位机上传数据异常。 解决过程:用示波器看发送端,有数据正常。示波器表笔接到上位机的发送端。就没有数据上传了。 原因:查看设计图纸,硬件设计,TX和RX的限流...
  • LabVIEW串口通信

    万次阅读 2022-05-03 15:50:46
    在LabVIEW中串口通信使用范围非常广泛,例如,通过串口使用ModBus协议驱动仪器、串口驱动PLC设备等。在LabVIEW中有专业的VI(VISA)可以驱动串口进行数据读、写操作,在函数面板 → 仪器I/O → 串口子面板中。
  • 为什么C#串口程序在关闭串口时候会死锁_老文章_赛迪网 http://www.ccidnet.com/2010/0524/2067861.shtml 【赛迪网讯】用过微软SerialPort...我想只有一半的人真的解决了。另外一半的人就睁只眼闭只眼阿弥佗佛
  • 现在我正在为/ dev / ttyS0制作串行通信程序.我使用netbeans在java中为双向串行通信制作了简单的程序.在我的处理器中,我将ttyS0的rx-tx缩短为环回连接检查.意味着我通过串口发送的东西,我回来了.但我得到错误.我在我...
  • platformio stm32 串口通信失败前言遇到的问题一 .创建的工程无法编译成功二 .编译好的工程无法下载到stm32三 . stm32串口用不起来 前言 最近是准备入手ESP32,板子还没到,不过看着platform io支持的平台还挺多的,...
  • 单片机串口通信实验报告总结

    千次阅读 2021-05-25 08:04:48
    一 、实验名称串口通信实验二、实验目的及要求1.掌握波特率设置及串口结构。2. 掌握串口方式一编程。三、实验主要仪器设备PC机实验原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,...
  • 打开串口时出现错误:MATLAB:serial:fopen:opfailed打开失败: Port: ...
  • 这个错误说是串口错误吧,有点牵强,因为那段用来串口通讯的源码肯定是没问题的,但是当和SD卡模块的代码组合在一起就产生莫名其妙的问题, 具体的问题主要是如下症状: 本程序中串口部分主要功能是发送一长串的...
  • 3.1.2 MSComm控件串行通信处理方式 47 3.1.3 MSComm 控件的属性说明 48 3.1.4 MSComm控件错误信息 55 3.2 使用MSComm控件的几个疑难问题 56 3.2.1 使用VARIANT 和SAFEARRAY 数据类型从串口读写数据 56 3.2.2 MSComm...
  • 串口通信协议

    2021-07-22 00:17:56
    尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,925
精华内容 21,170
关键字:

串口通信错误如何解决

友情链接: 25175xszytj_v2.1.1.rar