打印
[STM32F1]

串口发送数据,时间久了数据有丢失

[复制链接]
3232|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maxingyu|  楼主 | 2016-7-7 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助!
写了一个实时AD采集信号串口发送数据,经测试发现串口发送时时间一长就会丢失数据!

                                          while(i<=7)
                                {
                               
                                        while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //等待发送结束
                                        USART_SendData(USART1,ADC_RegularConvertedValueTab[i]);
                                 while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //等待发送结束
                                    USART_SendData(USART1,ADC_RegularConvertedValueTab[i]>>8);
                                    i++;
                                    
                                }

这是发送的程序。每次发送之前检查TC位为什么还会出错啊
AD采集是1ms采集一次,采8个通道发送一次
沙发
maxingyu|  楼主 | 2016-7-7 10:34 | 只看该作者
补充:
配置步骤:
1. 通过在USART_CR1寄存器上置位UE位来激活USART
2. 编程USART_CR1的M位来定义字长。
3. 在USART_CR2中编程停止位的位数。
4. 如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。
5. 利用USART_BRR寄存器选择要求的波特率。
6. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
7. 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。
8. 在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。

这是手册里关于UART的配置描述。 有几点疑惑:
1.第六条,怎么发送一个空闲帧,若是用库函数写怎么写?
2.TEX,TC都是能自动复位的吧?

使用特权

评论回复
板凳
maxingyu|  楼主 | 2016-7-7 10:43 | 只看该作者
void USART1_Configuration(void)
{

  USART_InitTypeDef USART_InitStructure;
  USART_ClockInitTypeDef  USART_ClockInitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE  );

  USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;                        // 时钟低电平活动
  USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;                                // 时钟低电平
  USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;                                // 时钟第二个边沿进行数据捕获
  USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;                // 最后一位数据的时钟脉冲不从SCLK输出
/* Configure the USART1 synchronous paramters */
  USART_ClockInit(USART1, &USART_ClockInitStructure);                                        // 时钟参数初始化设置
                                                                                                                                         
  USART_InitStructure.USART_BaudRate =115200;                                                  // 波特率为:115200
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;                          // 8位数据
  USART_InitStructure.USART_StopBits = USART_StopBits_2;                                  // 在帧结尾传输2个停止位
  USART_InitStructure.USART_Parity = USART_Parity_No ;                                  // 奇偶失能
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        // 硬件流控制失能

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                  // 发送使能+接收使能
/* Configure USART1 basic and asynchronous paramters */
  USART_Init(USART1, &USART_InitStructure);
   
  /* Enable USART1 */
  USART_ClearFlag(USART1, USART_IT_RXNE);                         //清中断,以免一启用中断后立即产生中断
  USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);                //使能USART1中断源
  USART_Cmd(USART1, ENABLE);                                                        //USART1总开关:开启
   USART_ClearFlag(USART1,USART_FLAG_TC);

}

这是UART的初始化部分

着急啊 请大家给我分析一下啊

使用特权

评论回复
地板
maxingyu|  楼主 | 2016-7-7 11:06 | 只看该作者
发现一个问题,出错之后硬件复位后又能正常工作。。我这是需要定时软件复位才行吗?

使用特权

评论回复
5
bitofnoone| | 2016-7-7 15:25 | 只看该作者
采样率太高了吧

使用特权

评论回复
6
bitofnoone| | 2016-7-7 15:26 | 只看该作者
另外,你的串口波特率最高是115200,采样率太高肯定会丢数

使用特权

评论回复
7
maxingyu|  楼主 | 2016-7-7 15:53 | 只看该作者
bitofnoone 发表于 2016-7-7 15:26
另外,你的串口波特率最高是115200,采样率太高肯定会丢数

我觉得不是这个原因。因为刚开始时时没有的,他是随着时间增加而有的

使用特权

评论回复
8
JasonWangSE| | 2016-7-8 10:36 | 只看该作者
是每个通道都是1ms采一次吗?这样的话8个通道1ms就是16byte的数据,加上起始位和停止位基本上相当于160bit的数据,算下来1s相当于要发160000bit的数据,高于你的波特率115200吧?

使用特权

评论回复
9
snail_dongbin| | 2016-7-8 12:07 | 只看该作者
我有一个问题,你怎么确定是单片机丢失了哪?从哪里监控出来的,为何不是上位机采集不到显示不出来?
串口我用了这么久了,第一次听说是发不出去,接收不到到时经常听到。

使用特权

评论回复
10
IversonCar| | 2016-7-8 20:59 | 只看该作者
你用的波特率是多少,波特率大了就容易丢数

使用特权

评论回复
11
charrijon| | 2016-7-12 12:27 | 只看该作者
没有把你的想法解释完整,比我,1ms采集8个通道数据,是定时采吗?在发送数据时是不是也在采?采集的优先级怎么样,是在中断里面做的?还有发送是每8ms定时发送吗?

使用特权

评论回复
12
neeringstu| | 2016-7-12 21:32 | 只看该作者
波特率太高,容易产生误码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

121

帖子

1

粉丝