极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22658|回复: 16

请教一下arduino串口通信的问题!

[复制链接]
发表于 2014-8-7 11:15:01 | 显示全部楼层 |阅读模式
RT,想请教一下arduino串口通信的问题,在网上查资料说,arduino1.0以前 清除串口缓存的函数是Serial.flush(),但是1.0之后这个函数已经改变了,我想问一下现在还有没有其他的函数能够清除串口缓存呢?
回复

使用道具 举报

 楼主| 发表于 2014-8-7 11:15:34 | 显示全部楼层
顶一下!~~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 11:35:10 | 显示全部楼层
New (Arduino 1.0+ Serial.Flush())
  1. void HardwareSerial::flush()
  2.     {
  3.       while (_tx_buffer->head != _tx_buffer->tail)
  4.         ;
  5.     }
复制代码
Old (Arduino 23- Serial.Flush())
  1.     void HardwareSerial::flush()
  2.     {
  3.       _rx_buffer->head = _rx_buffer->tail;
  4.     }
复制代码
flush函数老版本和新版本的区别,但是这个玩意在哪里改呢?请教一下!~~~
回复 支持 反对

使用道具 举报

发表于 2014-8-7 12:20:07 | 显示全部楼层
請問你用的是什麼版本?

v1.0.5:
  1. void HardwareSerial::flush()
  2. {
  3.   // UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT
  4.   while (transmitting && ! (*_ucsra & _BV(TXC0)));
  5.   transmitting = false;
  6. }
复制代码


v1.5.6, v1.5.7:
  1. void HardwareSerial::flush()
  2. {
  3.   // If we have never written a byte, no need to flush. This special
  4.   // case is needed since there is no way to force the TXC (transmit
  5.   // complete) bit to 1 during initialization
  6.   if (!_written)
  7.     return;

  8.   while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) {
  9.     if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0))
  10.         // Interrupts are globally disabled, but the DR empty
  11.         // interrupt should be enabled, so poll the DR empty flag to
  12.         // prevent deadlock
  13.         if (bit_is_set(*_ucsra, UDRE0))
  14.           _tx_udr_empty_irq();
  15.   }
  16.   // If we get here, nothing is queued anymore (DRIE is disabled) and
  17.   // the hardware finished tranmission (TXC is set).
  18. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 12:29:42 | 显示全部楼层
我用的是1.52
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 12:35:56 | 显示全部楼层
Super169 发表于 2014-8-7 12:20
請問你用的是什麼版本?

v1.0.5:

有没有其他函数来清除串口缓存的呀?
除了这个flush()
回复 支持 反对

使用道具 举报

发表于 2014-8-7 13:00:53 | 显示全部楼层
include_二世 发表于 2014-8-7 12:35
有没有其他函数来清除串口缓存的呀?
除了这个flush()

你的問題有點奇怪.
寫庫的人, 自己不應該寫兩個功能重複的函数, 最多只會是 alias.
其他人修改的或另外寫的庫, 就難以猜測了.  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 13:17:39 | 显示全部楼层
Super169 发表于 2014-8-7 13:00
你的問題有點奇怪.
寫庫的人, 自己不應該寫兩個功能重複的函数, 最多只會是 alias.
其他人修改的或另外 ...

不太明白您的意思,就说我现在用的是1.52的版本,我想问一下清除串口缓存用的是什么函数呢?
Serial.flush();
这个应该不能使用了,已经不是清除缓存的函数了!
回复 支持 反对

使用道具 举报

发表于 2014-8-7 13:32:36 | 显示全部楼层
1.0.5, 1.5.6 及 1.5.7 的都沒問題.

請問有什麼原因, 一定要用 1.5.2?

再者, 剛在網上下載了 v1.5.2, flush 也是正常的, 跟 1.0.5 一樣.

  1. void HardwareSerial::flush()
  2. {
  3.   // UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT
  4.   while (transmitting && ! (*_ucsra & _BV(TXC0)));
  5.   transmitting = false;
  6. }
复制代码



請問你的程式是從那裡得來的?  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 13:41:29 | 显示全部楼层
Super169 发表于 2014-8-7 13:32
1.0.5, 1.5.6 及 1.5.7 的都沒問題.

請問有什麼原因, 一定要用 1.5.2?

(⊙o⊙)…  难道是我的用法有问题?
但是我看arduino官网上的介绍:
flush()
Description

Waits for the transmission of outgoing serial data to complete. (Prior to Arduino 1.0, this instead removed any buffered incoming serial data.)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 13:50:51 | 显示全部楼层
Super169 发表于 2014-8-7 13:32
1.0.5, 1.5.6 及 1.5.7 的都沒問題.

請問有什麼原因, 一定要用 1.5.2?

怎么说呢?我现在通过串口接受数据,上层发过来的数据是10ms一次,每次我接受一次然后进行处理一下,然后我把上层的数据改了,但是arduino这边会有个很长的延迟才会接受到改了的数据,就是说不能适时刷新数据!~~貌似是开始采集了很多数据都卡在了缓存中!~~所以我想每次采集之前把缓存清空,然后就能实时的采集数据了!~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 13:56:50 | 显示全部楼层
Super169 发表于 2014-8-7 13:32
1.0.5, 1.5.6 及 1.5.7 的都沒問題.

請問有什麼原因, 一定要用 1.5.2?

用 while(Serial.read>=0);
解决了!~~
回复 支持 反对

使用道具 举报

发表于 2014-8-7 14:07:27 | 显示全部楼层
include_二世 发表于 2014-8-7 13:56
用 while(Serial.read>=0);
解决了!~~


請問你知道 flush 是做什麼的嗎?

你是在清除 input buffer, 而 flush 是把未送出的資料送出去.

照字面的解釋, 1.0 之前是有問題的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 14:19:17 | 显示全部楼层
Super169 发表于 2014-8-7 14:07
請問你知道 flush 是做什麼的嗎?

你是在清除 input buffer, 而 flush 是把未送出的資料送出去.

flush()  在1.0之前不就是清除缓存的意思么?
只不过1.0之后改了,他官方的文档不就是这么说的么?
回复 支持 反对

使用道具 举报

发表于 2014-8-7 14:26:23 | 显示全部楼层
include_二世 发表于 2014-8-7 14:19
flush()  在1.0之前不就是清除缓存的意思么?
只不过1.0之后改了,他官方的文档不就是这么说的么?

1.0 之前應該是做錯了.

由於我是從 1.0.5 開始用, 跟據 flush 的意思, 我沒想過會是用來清除 input buffer 的.
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 00:23 , Processed in 0.076558 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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