极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13038|回复: 3

关于虚拟串口的问题

[复制链接]
发表于 2014-4-30 12:08:15 | 显示全部楼层 |阅读模式
因工作需要,与串口设备进行通讯,两组串口输入,一组串口输出,在实际调试过程中,发现用SoftwareSerial虚似出来的两组串口在发送信号时,经常接收不到,而只虚拟一组串口则没有问题,使用官方例程也不行,各位大狭有没有遇到过这种问题的?使用的是Microduino的328P
官方例程如下:

#include <SoftwareSerial.h>

SoftwareSerial portOne(10,11);

SoftwareSerial portTwo(8,9);

void setup()
{

  Serial.begin(9600);
   while (!Serial) {

  }


  // Start each software serial port
  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop()
{

  portOne.listen();

  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  portTwo.listen();

  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }


}




回复

使用道具 举报

发表于 2014-4-30 12:27:29 | 显示全部楼层
你的訊號頻密嗎?  SoftwareSerial 的 buffer 只有 64 byte.

由於你的程式必須先完全接收一個才開始另一個, 如果資料太頻密, 有可能 portOne 還未接收完, portTwo 已超過 64 byte.

你可以嘗試修改 SoftwareSerial.cpp 中 _SS_MAX_RX_BUFF 增加 buffer size.
又或者限制每個 port 每次讀取的數量, 先 release 出來讓另一個 port 接收部份資料, 盡快清空 buffer.
回复 支持 反对

使用道具 举报

发表于 2014-4-30 12:32:16 | 显示全部楼层
再細看一下, 原來 active_object 只可以有一個.....
  static SoftwareSerial *active_object;

當 portOne.listen() 時, portTwo 不會接收資料.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-30 13:02:08 | 显示全部楼层
感谢Super169,数据交换确实很频繁,输入口不仅要输入,而且还要接收,看了你的分析,确实是这样,当程式循环到portTwo时,如果此时PortOne有数据进来,那么是接收不到的,增加Buffer应该没用处,所以,实在不行,只能换Arduino MEGA2560使用HardWare Serial了
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 21:32 , Processed in 0.037360 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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