你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8L051F3串口发送接收数据丢失

[复制链接]
HYP 提问时间:2016-12-5 18:13 /

牛人请指点下
串口初始化
void Uart1_Init(void)
{
SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA, ENABLE);
          CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
        GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);//TXD
          GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);//RXD
           GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2, ENABLE);
                  GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_3, ENABLE);
                 
  //        USART_DeInit(USART1);                //复位UART1
        /*
         * 将UART1配置为:
         * 波特率 = 38400
         * 数据位 = 8
         * 1位停止位
         * 无校验位
         * 使能接收和发送
         */
         
        USART_Init(USART1, (u32)38400, USART_WordLength_8b, USART_StopBits_1,
                                USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);

}

数据发送
void UART1_SendByte(u8 data)
{
          USART_SendData8(USART1, data);
        /* 等待传输结束 */
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}


main()
{
        u8 UART1_RX_BUF;
                CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);       
                  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_8);
                while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == RESET);    //2MHZ内部晶振

             Uart1_Init();   //串口1初始化
            while(1)
            {       
        /* 等待接收完成 */
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
           {
                  UART1_RX_BUF = USART_ReceiveData8(USART1);

                    UART1_SendByte(UART1_RX_BUF );
            }
}
以上就是所有程序,
目前问题是:
1.在用电脑串口助手发送数据时,如果一次只发送一个字节,则UART1_RX_BUF = USART_ReceiveData8(USART1)接收的是错误的数据,
2.只有在一次发送数据在两个字节以上时UART1_RX_BUF = USART_ReceiveData8(USART1)接收的数据从第二个字节开始才是准确的,
3.  UART1_SendByte(UART1_RX_BUF )在发送第一个字节时会出现数据丢失;
收藏 1 评论14 发布时间:2016-12-5 18:13

举报

14个回答
peter001 回答时间:2016-12-5 21:47:00
帮顶,跟踪一下,是不是覆盖了
小小超 回答时间:2016-12-19 08:19:04
        /* 等待接收完成 */
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
           {
                  UART1_RX_BUF = USART_ReceiveData8(USART1);

                    UART1_SendByte(UART1_RX_BUF );
            }

这里有问题吧?没接收完成就开始发送了?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

andrewz 回答时间:2016-12-19 08:48:11
试试Tx也拉高.或者,在TC置位之后再写buf?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

cldym 回答时间:2016-12-19 09:22:56
帮顶,跟踪一下,
党国特派员 回答时间:2016-12-19 10:22:26
RX,TX应该都设置为复用推挽+上拉。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

斜阳 回答时间:2016-12-19 11:17:14
帮顶               
无薪税绵 回答时间:2016-12-19 13:06:52
在初始化命令
Uart1_Init();   //串口1初始化  

后面加一句:
USART_GetITStatus(USART1, USART_FLAG_TC);

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

johnson_gong 回答时间:2016-12-19 14:04:49
在while(1)循环中,在 UART1_RX_BUF = USART_ReceiveData8(USART1);之后再加一句判断是否接收完,接收完才进入发送,没有接收完则继续等待接收完为止才执行下一步。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2016-12-19 16:17:57
没用过stm8,不过我想,接收改成中断模式更好吧?
lzts 回答时间:2016-12-19 20:14:58
没用过stm8, 你参考下F103的
初始化串口的最后加一个清标志动作.这个应该是你的问题3
USART_ClearFlag(USART3,USART_FLAG_TC); //清发送完成标志, 否则第一个发不出
1,2其实都是一个问题,你可试下在初始后串口的最后读一下串口试试.

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

huaiqiao 回答时间:2016-12-19 20:18:52
不用接收中断?不用像32一样,清除中断标志位?


还有  UART1_RX_BUF是什么类型的?是uiint8_t或者u8类型么?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zbber 回答时间:2016-12-19 23:13:52
在初始化命令
时光虫子 回答时间:2016-12-20 08:48:43
你把波特率设置低一点看看,最好用示波器看看PC发送的数据正不正确,在看RS232输出到单片机的数据正不正确,这样来排除问题

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

xmshao 回答时间:2016-12-20 11:07:40
本帖最后由 xmshao 于 2016-12-20 11:09 编辑

问题出在这里。USART_ClearFlag(USART3,USART_FLAG_TC); ==>改为查TXE

这里描述的比较清楚。一个关于USART 传输标志TXE/TC 的话题

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版