极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11614|回复: 4

Arduino 串口自带类库有问题吗?求高人指点

[复制链接]
发表于 2015-2-5 23:05:50 | 显示全部楼层 |阅读模式
本帖最后由 kenchen 于 2015-2-5 23:44 编辑

Arduino串口初始化一般使用 Serial.Begin(9600);//当然没有问题
但是要和特殊设备如PLC通信时要用到特殊的校验位数等
Serial.begin(9600,SERIAL_7E1);//一般板子没问题
但当我用到 Arduino DUE 这个多串口的板子时,就编译错误,是类库的问题,有未定义的常量
为什么要用 Arduino DUE 这个多串口的板子?
1.性能好
2.硬件串口有4个,随便用
3.每个IO都能硬件中断,方便
那用软串口可以吗?不行
软串口Begin()只能有1个参数,不支持其他特殊连接校验位数等
那位大神有办法呢???
谢谢了!
回复

使用道具 举报

发表于 2015-2-6 01:02:19 | 显示全部楼层
對, 應該是庫的問題.
你也有安裝 arduino IDE 1.5.X 吧, 對比一下:

DUE 用的 hardware seerial
[IDE]\hardware\arduino\sam\cores\arduino\HardwareSerial.h

其他板子用的 hardware seerial
[IDE]\hardware\arduino\avr\cores\arduino\HardwareSerial.h

當中 begin 的定義, 在 DUE (sam) 的那個, 只有
    virtual void begin(unsigned long);

而其他板子 (avr) 的, 有兩個用法, 預設 8N1:
    void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
    void begin(unsigned long, uint8_t);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 01:22:08 | 显示全部楼层
Super169 发表于 2015-2-6 01:02
對, 應該是庫的問題.
你也有安裝 arduino IDE 1.5.X 吧, 對比一下:

Serial的Begin()是只有1个参数,
但是Serial1~3是
void begin(unsigned long, uint8_t);
有2个参数的,也不行啊!第2个参数改为0x24这样就没问题
可能Serial是跟电脑编程时通讯,所以不需要第2个参数,1~3是需要有的
回复 支持 反对

使用道具 举报

发表于 2015-2-6 11:20:16 | 显示全部楼层
本帖最后由 Super169 于 2015-2-6 11:21 编辑
kenchen 发表于 2015-2-6 01:22
Serial的Begin()是只有1个参数,
但是Serial1~3是
void begin(unsigned long, uint8_t);


oh, 原來 Serial1~3 是用 USART 的, 確是有 2 個 parameters.

不過, SERIAL_7E1 只在 avr 的 HardwareSerial.h 中定義, 在 sam 的 HardwareSerial.h 中沒有, 所以不能用到, 只可用回 0x24.  SERIAL_7E1 只不過是一個 alias, 最後也是被轉換成 0x24.
如果 sam 跟 avr 的設定是通用的話, 你可以把 avr 中的 SERIAL_??? 定義部份加到 sam 或自己的程式 之中, 就可以在程式中使用 SERIAL_7E1 了.

Serial 除了接 USB 外, 還可以用 D0 及 D1 接, 也可以用來接其他東西的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 11:30:44 | 显示全部楼层
缺失常量声明在
arduino-1.5.8\hardware\arduino\sam\system\CMSIS\Device\ATMEL\sam4s\include\sam4s8c.h
等几个头文件都有,但是不能直接include,因为里面有更多找不到的声明,感觉这个官方库做得好乱,估计是DUE比较新没优化好,可以找到定义的常量声明直接复制过来
#define   US_MR_USART_MODE_NORMAL (0x0u << 0) /**< \brief (US_MR) Normal mode */
#define   US_MR_USCLKS_MCK (0x0u << 4) /**< \brief (US_MR) Master Clock MCK is selected */
#define   US_MR_CHRL_7_BIT (0x2u << 6) /**< \brief (US_MR) Character length is 7 bits */
#define   US_MR_PAR_EVEN (0x0u << 9) /**< \brief (US_MR) Even parity */
#define   US_MR_NBSTOP_1_BIT (0x0u << 12) /**< \brief (US_MR) 1 stop bit */
#define   US_MR_CHMODE_NORMAL (0x0u << 14) /**< \brief (US_MR) Normal Mode */
这样就解决了,使用0x24也不是办法,因为这是在uno上的定义,不知道due里是不是这个值,谢谢你了
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 17:58 , Processed in 0.035491 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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