OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2347|回复: 6

关于串口发送操作的问题

[复制链接]

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
发表于 2018-3-6 18:05:08 | 显示全部楼层 |阅读模式
5金钱
现在项目上要求用串口读取传感器上的数据,要求串口在每次发送读取命令给传感器之前,先根据传感器的类型来重新设置串口的参数,即每次读取传感器的时候都更新一次串口的设置。我的设置代码是这样的[mw_shl_code=c,true]//更新串口配置

void uart_update(USART_NO usart_no,u32 bound,u16 WordLength,u16 StopBits,u16 Parity)
{
        USART_TypeDef* USARTx;
        USART_InitTypeDef USART_InitStructure;

         switch(usart_no)
         {
                 case USART_1:
                                        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        //使能USART1
                                        USARTx=USART1;
                                        break;
                 case USART_2:
                                        //RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);        //使能USART2
                                        USARTx=USART2;
                                        break;
                 case USART_3:
                                        //RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);        //使能USART3
                                        USARTx=USART3;
                                        break;
                 case USART_4:
                                        //RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);        //使能USART4
                                        USARTx=UART4;
                                        break;
                 case USART_5:
                                        //RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);        //使能USART5
                                        USARTx=UART5;
                                        break;
                 default: break;
                 
         }  
   //USART 初始化设置
        USART_Cmd(USARTx, DISABLE);                    //关闭串口
        //USART_DeInit(USARTx);                          //复位串口
       
        USART_InitStructure.USART_BaudRate = bound;//设置波特率
        USART_InitStructure.USART_WordLength = WordLength;//设置字长格式
        USART_InitStructure.USART_StopBits = StopBits;//设置停止位格式
        USART_InitStructure.USART_Parity = Parity;//设置奇偶校验位格式
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  USART_Init(USARTx, &USART_InitStructure); //初始化串口
  USART_Cmd(USARTx, ENABLE);                    //使能串口

}[/mw_shl_code]
每次重新操作之后第一个字节都会输出FF,是操作问题吗?有什么方法可以解决?

最佳答案

查看完整内容[请看2#楼]

每次都复位的话第一个字节会丢失,我在TX脚加个上拉电阻解决啦
为自己掌握新的知识感到快乐
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
 楼主| 发表于 2018-3-6 18:05:09 | 显示全部楼层
lvkanger 发表于 2018-3-7 10:01
以前这么用过,需要注意的一点就是每次都先Deinit,然后再按照不同的参数进行init

每次都复位的话第一个字节会丢失,我在TX脚加个上拉电阻解决啦
为自己掌握新的知识感到快乐
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-7 01:19:40 | 显示全部楼层
我估计是你初始化串口引起的。不要每次都重新初始化吧,你一次性把串口1~5全部初始化完了,用哪个就写哪个DR完事了,没必要每次都重新配置串口。
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
 楼主| 发表于 2018-3-7 09:13:53 | 显示全部楼层
正点原子 发表于 2018-3-7 01:19
我估计是你初始化串口引起的。不要每次都重新初始化吧,你一次性把串口1~5全部初始化完了,用哪个就写哪个D ...

因为我一个串口通过RS485要挂多个传感器,但是传感器的通讯配置不一定都一样,所以每次读都需要根据传感器的配置重新配置串口参数
为自己掌握新的知识感到快乐
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7546
金钱
7546
注册时间
2016-11-30
在线时间
642 小时
发表于 2018-3-7 10:01:10 | 显示全部楼层
Jundodo 发表于 2018-3-7 09:13
因为我一个串口通过RS485要挂多个传感器,但是传感器的通讯配置不一定都一样,所以每次读都需要根据传感 ...

以前这么用过,需要注意的一点就是每次都先Deinit,然后再按照不同的参数进行init
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2018-3-7 10:49:37 | 显示全部楼层
Jundodo 发表于 2018-3-7 09:13
因为我一个串口通过RS485要挂多个传感器,但是传感器的通讯配置不一定都一样,所以每次读都需要根据传感 ...

一般的RS485设备都是可以设置波特率、数据位的,尽量统一比较好,
回复

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
 楼主| 发表于 2018-3-19 12:00:53 | 显示全部楼层
我把关闭串口的USART_CMD();这句注释掉以后不需要加上拉电阻也可以正常通讯啦,不过前提是要在串口处于空闲状态,没有在数据在接收和发送
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 21:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表