fastzhou 发表于 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);
}


}




Super169 发表于 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.

Super169 发表于 2014-4-30 12:32:16

再細看一下, 原來 active_object 只可以有一個.....
static SoftwareSerial *active_object;

當 portOne.listen() 時, portTwo 不會接收資料.

fastzhou 发表于 2014-4-30 13:02:08

感谢Super169,数据交换确实很频繁,输入口不仅要输入,而且还要接收,看了你的分析,确实是这样,当程式循环到portTwo时,如果此时PortOne有数据进来,那么是接收不到的,增加Buffer应该没用处,所以,实在不行,只能换Arduino MEGA2560使用HardWare Serial了
页: [1]
查看完整版本: 关于虚拟串口的问题