串口通讯(485,9600) 数据接收如何做到 及时且准确。

2019-10-12 15:33 [复制链接] 5 507

本帖最后由 mian面mian 于 2019-10-12 15:42 编辑 # w" S. F( w! y& a! W9 m" Z5 F1 B, }
7 j9 N4 m5 P! t5 Z4 O5 G
微信图片_20191012152512.png / g8 Z/ s1 ^0 l) c. S

: r+ C+ e, x8 ^" X+ i" @问题: 在有多个线程同时工作时,用上位机 给 下位机 发8-12个字节的数据(如:0xA4 0xA2 0x18 0x18 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7 0XAA),如何确保下位机能准确、及时(100ms一次时,每次都能收到12字节,不会漏数据),不打乱顺序的接收到 这 12byte 数据?; n0 ]& Q( d) b' H* A' a
5 B) z2 ], k1 K
串口通讯(485):波特率为9600,, }# q) T# i3 m' N2 o

2 Q$ ~: s" h& x单片机:STM32F103VET6  ;8 l$ \; O9 I6 Y1 c( J' _# l

: \9 U0 [+ I/ i& m: u' s0 S7 J:):):):):)2 x# B- v, ~% j
5 G# n% O$ F4 ~, `
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-10-12 15:54:34 | 显示全部楼层
你这不是串口最基本的功能吗?
/ u" x* G; T: |5 C2 u1 Z看这里,有例程的https://www.rt-thread.org/docume ... l/device/uart/uart/
使用道具 举报 回复
发表于 2019-10-14 10:57:10 | 显示全部楼层
本帖最后由 aozima 于 2019-10-14 11:07 编辑
) ]/ u# g, _7 X9 Y  Z% j
sync 发表于 2019-10-12 15:54
% k& \3 m2 J* X  ]7 p& W你这不是串口最基本的功能吗?* M4 t# h# i. i% R5 [& L
看这里,有例程的https://www.rt-thread.org/document/site/programming-man ...

) P, o4 o% X4 u* F. j0 x2 J恕我愚笨,谢谢你的回复,但是 我还是没能理解,
( Q% v9 d# g% z( d
# t, ^5 I3 D- A  h3 x1 ?我现在是按如下处理的,但是每100ms发一条0xA4 A1 A2 A3 A4 AA,不能做到每100ms都能回0XA2.( C8 l+ `. h0 V. d. G: C  k( Q

6 N( T" V8 U9 ?+ O& L
  1.                 static uint8_t temp[6]={0};
    ; H* i$ b/ N0 C' I1 K& Q
  2.                 Usart_RX_set_enable();' E" a$ b  y/ d3 c' H5 l* v
  3.                 __HAL_UART_FLUSH_DRREGISTER(&uart->handle);
    8 Z# W5 l5 J6 D( N% N! p2 ~
  4.                 while(1)8 j) r6 W  n  N* D: `
  5.                 {& h! H* P& s/ U, r% i7 k( q
  6.                         rt_memset(temp,0,sizeof(temp));
    & J6 b2 i3 Y* G1 f% W" k
  7.                         ( u$ b4 V5 H) b; l, q  s
  8.                         HAL_UART_Receive(&uart->handle,&temp[0],6,RX_TIMEOUT);
    / w% A2 |1 [* @( i
  9.                         + }. A4 p- W2 ^" S
  10.                         if(temp[0]==0xa4&&temp[5]==0xaa): I9 Z. P5 L! }& A7 v+ @- z# c7 r
  11.                         {! I9 N  W( c" W/ S- n( v( {8 G
  12.                                 temp[0]=0xa2;6 A) |6 ?) c1 _9 g
  13.                                 Usart_TX_set_enable();! U  V# l% k  j4 V! q  B" X
  14.                                 HAL_UART_Transmit(&uart->handle,&temp[0],1,TX_TIMEOUT);. s! O& k7 n' e  d. g2 X! R
  15.                                 Usart_RX_set_enable();5 r" S: f* a$ H
  16.                         }' U2 P$ k2 g4 W0 m) Z! w* f9 e
  17.                         rt_thread_delay(1);
    " A) i. S4 t4 K) m  d# j7 t5 ^
  18.                 }
复制代码

  x, t/ @: L# g7 K
使用道具 举报 回复
发表于 2019-10-14 11:04:13 | 显示全部楼层
如果楼主已经可以正常收发数据,只是下位机响应时间不是很及时的话,那就是优先级的问题了,你可以把线程优先级设置为高,应该响应就会及时很多了。
使用道具 举报 回复
发表于 2019-11-26 09:14:18 | 显示全部楼层
sync 发表于 2019-10-14 11:049 |8 A! ]2 ~: \! N) I1 y; r& ^3 g, e
如果楼主已经可以正常收发数据,只是下位机响应时间不是很及时的话,那就是优先级的问题了,你可以把线程优 ...
% f* T+ ]' M; Z3 W3 C
已经 处理好了。) }2 _# t4 l" [( R

9 F8 S* a$ {  X" _% A0 c$ d/ r主要是初始化 这里 ,6 @  s# h4 [# V' U' u9 A
/**! k- \: u. T$ x" Y' i
* @brief UART MSP Initialization
5 A& U% j* s; h! Y9 l4 K* This function configures the hardware resources used in this example
- O0 A7 B$ l( Y* @param huart: UART handle pointer
: {3 J: e! Z+ R: J* T2 T* @retval None% I3 A* k! N4 S  P2 @3 t
*/
0 v9 f4 E/ r. \7 O6 Nvoid HAL_UART_MspInit(UART_HandleTypeDef* huart)/ c. l( h( [( |7 U0 Z& f! a
{
6 x3 O: e1 Y3 q; z0 {* ?+ i0 m* T( r" X6 s/ J
  GPIO_InitTypeDef GPIO_InitStruct = {0};0 O8 c, F( ~5 G! u$ U& N
  if(huart->Instance==USART1)
4 ^7 o. G2 [" o1 r5 }! y  {
, O' s9 q- m# Z1 b; m3 [: G  /* USER CODE BEGIN USART1_MspInit 0 */5 R: X# Y) S2 d1 Y3 O
  /* USER CODE END USART1_MspInit 0 */5 D! d# m/ i+ r3 A
    /* Peripheral clock enable */
# h2 }0 i) A: l$ \    __HAL_RCC_USART1_CLK_ENABLE();
( w% n5 u* U8 R! h1 m% }    ^4 O, B4 ~( d  H+ D
    __HAL_RCC_GPIOA_CLK_ENABLE();
6 e6 c7 E% \$ q+ w' N2 P    /**USART1 GPIO Configuration   
# c4 H& N" k- t- p    PA9     ------> USART1_TX7 n) y4 f. |- S  Z/ h2 e! M
    PA10     ------> USART1_RX , L6 F: f1 ?' T) F7 n
    */
" w1 z. K' v& G    GPIO_InitStruct.Pin = GPIO_PIN_9;4 A5 x5 ?5 D* a3 B4 N/ I: h4 d
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
5 ?) r0 q7 b; e" i6 Y    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
8 q- ]6 e9 b9 R% H    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
; h5 {/ C4 D8 ?' Q8 z2 Q+ c9 M; l5 b# x+ ?7 j' E+ i* k
    GPIO_InitStruct.Pin = GPIO_PIN_10;- ~4 S' P, m# Y5 @5 i
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
8 |3 i5 _. Y, W& x( G" a    GPIO_InitStruct.Pull = GPIO_NOPULL;- {% B- ^0 }% X; B  }- j
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
. S- I  q1 a! n3 e$ w* t
2 f7 z* F* ~7 _, V' X    /* USART1 interrupt Init */9 k/ ?" E  L. e2 Z3 m& r) J8 m
//                __HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);5 P3 e! W0 B: h6 t
//    HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);
$ ]0 R% I% Y1 {. l0 ?- i//    HAL_NVIC_EnableIRQ(USART1_IRQn);9 V6 {$ Q, e! z
               
  e9 G, e2 ?5 [8 Y, X/ P                  __HAL_UART_DISABLE_IT(&uart->handle,UART_IT_TC);
# |& \+ U# n! _2 \$ {7 |0 n) V& x9 \- {) t
                        __HAL_UART_ENABLE_IT(&uart->handle,UART_IT_RXNE);                                //开启中断接收
" B9 E& B# K1 T+ B8 X2 B                        $ i3 }- [9 O4 G9 O' w3 D+ ^
                        HAL_NVIC_EnableIRQ(USART1_IRQn);        # n: @  U$ q6 f  f
                       
5 m) |7 z; J4 c! H" N$ f( P- g! u% z                        HAL_NVIC_SetPriority(USART1_IRQn,3,1);                                
+ N( |2 I6 q( `$ m3 S. n) ?% }  n- J& L& J8 g
               
8 s( A" V5 z# g' U) m4 n                : ]& n4 B( e9 D% V  }. c* k
  /* USER CODE BEGIN USART1_MspInit 1 */
8 S7 }- h6 i. I6 o       
4 [" [$ C7 z0 ?: [7 p+ e. W% N/ Z, K# b       
, G6 R; K- L0 b4 U2 H  /* USER CODE END USART1_MspInit 1 */
. E7 h5 `9 k4 y6 c# G  }4 m, H# |- }; {0 |/ `( }

1 H/ H( A! |! d, G}- l4 b! w9 \% v
以及中断服务函数  m0 W5 k( U+ N" X# h/ y8 y
void USART1_IRQHandler(void)
; O9 F. K* t' ~3 a{  {5 Z9 ?! ~6 V$ W2 O. D
                static uint16_t UART_IQR_Rxbyte_Numcnt=0;# K/ V) a! |6 ?: w, f4 [0 k
                static uint8_t         UART_IQR_Rxdata_Byte[20]={0};! F$ O& _  o0 K6 n" R% P' e! d
                uint8_t UART_IQR_Rxdata_temp=0,sum_chk=0,xor_chk=0,neg_chk=0,crc_chk=0,dif_chk;/ D2 a  [- I$ A
    /* enter interrupt */) ^# U4 C  i2 \* n9 S# U# Q" F
    rt_interrupt_enter();       
' p" ]+ ~* m- {. O" g2 ^; n9 f
7 U: k1 Y8 c4 a7 I0 o3 E//    uart_isr(&(uart_obj[UART1_INDEX].serial));    0 Z/ [  D) P9 i8 @

9 T9 I, C# y# ]) r- {3 M$ O6 j" Q4 Z   uart_isr(&(uart_obj[UART1_INDEX].serial)) 并把这条代码屏蔽掉。
使用道具 举报 回复
发表于 2019-11-26 09:19:44 | 显示全部楼层
已经 处理好了,每100ms 接收20字节数据 发送10字节数据  ,在收发数据量 到达  上10W字节 时 才出现 几十字节的 异常。( M/ y* W6 p# O% ?  T

( M! W8 M( v9 P. T1 ]0 r0 n主要是初始化 这里 ,
/ h  I5 P/ S) `2 a" D' K7 }/**, A0 ?# i1 p$ @3 y( l
* @brief UART MSP Initialization
" M9 Z2 `; r+ \4 x/ Z* This function configures the hardware resources used in this example
9 {& {0 n( C( B! ^; j* @param huart: UART handle pointer
3 ~! O3 {2 ]& w0 `5 y: @* @retval None
. W7 I  k  l; h! N3 Y5 K*/
/ D0 r, I! y' H+ V0 S3 P# Z: u" kvoid HAL_UART_MspInit(UART_HandleTypeDef* huart)
- T% V; ^- z% z  N( ~{* h" q$ t! c6 R' Y# t* [
5 B) k5 D! B, a' t% G
  GPIO_InitTypeDef GPIO_InitStruct = {0};  B) ?7 J; K2 z/ [. r% R
  if(huart->Instance==USART1)
7 @" n6 s( t/ U! f, G  {
/ `# s* |7 K: V3 a  /* USER CODE BEGIN USART1_MspInit 0 */
5 G7 X$ n+ \* S# i% u  /* USER CODE END USART1_MspInit 0 */
* U" }2 _% g; {  M    /* Peripheral clock enable */
, g; \! s; E; d+ X* k    __HAL_RCC_USART1_CLK_ENABLE();
7 U, s2 B" ?! R  
' H. H& {" N2 B( H    __HAL_RCC_GPIOA_CLK_ENABLE();7 B% f/ Q* d. t7 {/ z
    /**USART1 GPIO Configuration   
; l, A( [* W- B' h0 ~/ C6 R    PA9     ------> USART1_TX7 ~6 R! O. H7 y5 B
    PA10     ------> USART1_RX
+ p- \) L: Y( Y& c4 E    *// N( G4 b" H- G% Q0 _: b! V2 @
    GPIO_InitStruct.Pin = GPIO_PIN_9;& n$ q( o: r; ~7 }1 ^1 I% z
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  t  J& a6 x* P0 X
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
2 L7 y- y, e0 D" a5 y4 u    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
' C* d+ c" v+ n. [8 c" j2 R) d+ |8 w& T9 u. V
    GPIO_InitStruct.Pin = GPIO_PIN_10;" i' T# m# V8 d9 t
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
% K) c8 w# l  Z3 l7 {* B    GPIO_InitStruct.Pull = GPIO_NOPULL;
# t1 W6 e8 q0 X7 \' Z    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
8 z. p0 M# t4 g- m) ^
; V# h8 f( l5 D    /* USART1 interrupt Init */" i1 [: ?# n; ?
//                __HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);3 `" q! C6 e" A9 \! z
//    HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);
# ^" L- I" a' T//    HAL_NVIC_EnableIRQ(USART1_IRQn);
0 x$ }' t- E5 ]8 L                  |' b" a( I% b8 Y" R% v
                  __HAL_UART_DISABLE_IT(&uart->handle,UART_IT_TC);2 |4 I" V: Y" V7 R) O7 s
/ Q1 }) O: [; y) `4 X( F* K9 e( j
                        __HAL_UART_ENABLE_IT(&uart->handle,UART_IT_RXNE);                                //开启中断接收
3 ]' \! L, R- O; T  v2 ~  Z                        8 f9 G& I2 ~0 ^3 Y
                        HAL_NVIC_EnableIRQ(USART1_IRQn);        % h7 y3 s  w) }& X$ }
                        
( G) b3 L8 n- z2 u/ f  b                        HAL_NVIC_SetPriority(USART1_IRQn,3,1);                                3 I$ E4 c) ?. x& J7 |

* K; B9 M3 d' b' H7 X0 ]                8 J$ L4 z4 \/ r0 {& A
               
. M% A+ h4 C: s6 Q" v  h  /* USER CODE BEGIN USART1_MspInit 1 */3 z' ^% P$ B4 J. k* Y" c' y
        / b' f( K) m5 c3 N- _/ m$ O$ _
        
. m7 M) \! w, m& Q# S  /* USER CODE END USART1_MspInit 1 */+ j/ c9 G# k- l$ [( B
  }
. h; e# Q, S# ~( Z7 t* ~  k
2 a8 }# |4 W7 U- R}1 t* L/ k3 C  H5 G$ i; `* V' ^# ^5 R( i
以及中断服务函数
6 ^; c# m3 V: e2 ~! _+ F4 A( \+ zvoid USART1_IRQHandler(void)
% A5 b, S0 `1 e7 c$ ]{4 q% H; y  R* g
                static uint16_t UART_IQR_Rxbyte_Numcnt=0;
" R6 z% X8 _9 M                static uint8_t         UART_IQR_Rxdata_Byte[20]={0};
9 [0 q( y" m) R- W$ j3 k                uint8_t UART_IQR_Rxdata_temp=0,sum_chk=0,xor_chk=0,neg_chk=0,crc_chk=0,dif_chk;% m. ^1 U  k+ @5 }- V
    /* enter interrupt */) H& O, C1 n1 D3 C) p7 h
    rt_interrupt_enter();        
% c/ }6 [5 h8 T' U+ d. h' I% B+ {7 q  k4 i8 |
//    uart_isr(&(uart_obj[UART1_INDEX].serial));    : [1 L8 Q; [( c8 n, l1 |1 J# m( h0 }

3 H3 ^9 A( M7 r* Z   uart_isr(&(uart_obj[UART1_INDEX].serial)) 并把这条代码屏蔽掉。
; g( R" r# S" l, A
微信图片_20191126091530.png
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 2 主题
  2. 32 帖子
  3. 32 积分

Ta的主页 发消息

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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