OpenEdv-开源电子网

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

串口1228800波特率通讯故障

[复制链接]

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
发表于 2017-7-12 11:44:01 | 显示全部楼层 |阅读模式
本帖最后由 shaozp 于 2017-7-12 11:45 编辑

由于项目需要,将单片机F103 的USART3 的波特率配置成了1228800bps,串口接收数据都是可以的,但是串口发送数据 的时候第一个和第二个字节就会出错。

比如我发送:01 02 03 04 这样的数据包,发送出去之后就每次都会变成  CC C2 03 04

但是第一个字节要是变成 00 02 03 04  发送之后数据发送包就会正常,有一定的概率出现 错误,但是还可以接受


有人这样子用过吗?


[mw_shl_code=c,true]void USART3Write(u8 *data, u16 len)
{
    u16 i;
   
    USART3_Recive_flg = 0;  //数据发送的时候将接收模式清零
    USART3_Recive_leng =0;  //将接收数据长度清零
    USART_ClearFlag(USART3,USART_FLAG_TC);
    USART3_485_H;//发送模式
   
    for (i = 0; i < len; i++)
    {
         
        USART3_SendByte(data);
    }
   
    USART3_485_L;//接收模式
}

void USART3_SendByte(u16 Data)
{
    while (!(USART3->SR & USART_FLAG_TXE)); //等待数据从软件拷贝到硬件进行发送
    USART3->DR = (Data & (uint16_t)0x01FF);
    while (!(USART3->SR & USART_FLAG_TC));//硬件数据发送完毕
}



void USART3_Configuration(void)
{
        
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);        //使能APB2外设的GPIOA的时钟                 
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
   
    /* 配置USART3-TX脚PC10 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    /* 配置USART3-RX脚 PC11*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    //USART3_R/D        PA12
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
          USART3_485_L;//接收模式
         
          //将USART3的TXD和RXD重映射到PC10和pc11
        GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);
  
    USART_InitStructure.USART_BaudRate            = 1228800; //液晶面板进行配置1.2M
    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(USART3, &USART_InitStructure);
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);  //打开接收中断
    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);  //打开接收完毕中断
    USART_Cmd(USART3, ENABLE);
}

[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1665
金钱
1665
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-7-12 12:18:40 | 显示全部楼层

回帖奖励 +2 金钱

485控制脚的电平变化后,加点延时
回复 支持 反对

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
 楼主| 发表于 2017-7-12 15:11:12 | 显示全部楼层
d1z1y2 发表于 2017-7-12 12:18
485控制脚的电平变化后,加点延时

最后一个字节丢失 是延时的问题,

问题自己找到了 ,用示波器看是使用的485芯片的问题,芯片最大支持250kbps,而我用的1228800bps所以超范围了。 换成速率为10M的485芯片就OK了

还是非常感谢!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-18 16:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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