作者 主题:如何在Arduino上发送不同的软件串行输出串行命令? (Read 4878 times)

0会员和1位客人正在查看此主题。

离线 Abdullahseba.

  • 频繁的贡献者
  • **
  • 帖子:335
  • 国家: GB.
你好
如何通过USB接口发送字符串,然后根据字符串内部将它们路由到不同的软件串行输出?
例如:
Arduino收到:"O2-dothis" Arduino sends "dothis"出输出引脚2。
Arduino收到:"O3-dothis2" Arduino sends "dothis2"出输出引脚3。
提前致谢。
这是我的右手这是我的错误手
 

离线 ade.

  • 支持者
  • ****
  • 帖子:231
  • 国家: 加利福尼亚州
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#1开: 2016年3月18日,08:52:36 PM»
使用if语句,或根据您的要求使用更复杂的选择逻辑。 但精确的引脚将取决于您拥有的板。 

请注意,一般串行端口需要两个引脚:一个用于发送(TX),另一个用于接收(Rx)。 软件端口的限制是您一次只能在一个端口上接收...不确定是否'重新期待港口的回复。

除了软件端口,您还可以使用常规(硬件)串行端口。   因此,您的第一个串行端口可能位于引脚0和1上。 您的第二个串口(根据您的电路板)可能位于引脚18和19等上。 除了USB端口外,使用硬件端口允许您从多个串行端口接收。
« 上次编辑:2016年3月18日,08:55:30 Ade »
 

离线 迈克利夫

  • 频繁的贡献者
  • **
  • 帖子:260
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#2开: 2016年3月18日,晚上10:25:30»
没有神奇的方式来自动执行此操作,您必须编写代码来执行此操作。

algo看起来像:
string = usb_serial.read_string.
如果(字符串从"O2")
   serial2.write(String - 前2个字符)
否则if(字符串从"O3")
   serial3.write(String - 前2个字符)

如果您想要更多的建议,如果您发布代码会有所帮助。
如果您关心性能,则可以处理单个字符而不是读取字符串。
 

离线 Abdullahseba.

  • 频繁的贡献者
  • **
  • 帖子:335
  • 国家: GB.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#3开: 2016年3月19日,03:09:31 PM»
没有神奇的方式来自动执行此操作,您必须编写代码来执行此操作。

algo看起来像:
string = usb_serial.read_string.
如果(字符串从"O2")
   serial2.write(String - 前2个字符)
否则if(字符串从"O3")
   serial3.write(String - 前2个字符)

如果您想要更多的建议,如果您发布代码会有所帮助。
如果您关心性能,则可以处理单个字符而不是读取字符串。
经过几个小时的流行 :scared: 我终于锻炼了一些东西。
只需发送引脚数,然后发送字符串,例如:(7只猫)将通过PIN 7发送CAT,或者您可以说:(31CAT),它将在引脚31上发送CAT 31。
那里'我申请的一个大垮台,它的速度很慢 | O. 除非它可以优化我必须使用更快的微控制器。
代码: [选择]
#include <SoftwareSerial.h>
细绳  incomingByte = "";   

void setup() {
  Serial.begin(250000);   
}

void loop() {

  // send data only when you receive data:
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.readString();

    String Data = incomingByte;
    Data.remove(0, 2);
    String TX = incomingByte;
    TX.remove(2);
    SoftwareSerial mySerial(10, TX.toInt()); // RX, TX
    mySerial.begin(250000);
    mySerial.println(Data);
  }
}
这是我的右手这是我的错误手
 

离线 迈克利夫

  • 频繁的贡献者
  • **
  • 帖子:260
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#4开: 2016年3月19日,03:53:42 PM»
那里'我申请的一个大垮台,它的速度很慢 | O. 除非它可以优化我必须使用更快的微控制器。
它现在有多慢,需要快速度?
 

离线 ade.

  • 支持者
  • ****
  • 帖子:231
  • 国家: 加利福尼亚州
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#5: 2016年3月19日,04:01:35 PM»
没有谱图,它'可能很慢,因为您正在初始化软件串行端口,设置其速度等, 每次循环中的每个命令。 如果您可以预先预先设置端口,则可能会更快地运行。
 

离线 Abdullahseba.

  • 频繁的贡献者
  • **
  • 帖子:335
  • 国家: GB.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#6开启: 2016年3月19日,09:43:36 PM»
那里'我申请的一个大垮台,它的速度很慢 | O. 除非它可以优化我必须使用更快的微控制器。
它现在有多慢,需要快速度?
1秒延迟,它需要瞬时作为正常的串行通信。
这是我的右手这是我的错误手
 

离线 Abdullahseba.

  • 频繁的贡献者
  • **
  • 帖子:335
  • 国家: GB.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#7: 2016年3月19日,09:49:19 PM»
没有谱图,它'可能很慢,因为您正在初始化软件串行端口,设置其速度等, 每次循环中的每个命令。 如果您可以预先预先设置端口,则可能会更快地运行。
您不能在每次第一个数字更改时都需要重新初始化软件序列。
我不't  think  that'如果我尝试过这个问题 你用开关案件说了什么,但它仍然具有相同的速度问题,并且不太灵活。
代码: [选择]
#include <SoftwareSerial.h>
SoftwareSerial one(13, 4);
SoftwareSerial two(13, 5);
SoftwareSerial three(13, 6);
SoftwareSerial four(13, 7);
SoftwareSerial five(13, 8);
SoftwareSerial six(13, 9);
void setup() {
 Serial.begin(9600);
 one.begin(9600);
 two.begin(9600);
 three.begin(9600);
 four.begin(9600);
 five.begin(9600);
 six.begin(9600);
 

}

void loop() {
  if (Serial.available() > 0) {
    String incomingByte = Serial.readString();
    String Data = incomingByte;
    Data.remove(0, 2);
    String TX = incomingByte;
    TX.remove(2);
  switch (TX.toInt()) {
    case 4:
      one.println(Data);
      break;
    case 5:
      two.println(Data);
      break;
    case 6:
      three.println(Data);
      break;
    case 7:
      four.println(Data);
      break;
      case 8:
      five.println(Data);
      break;
    case 9:
      six.println(Data);
      break;
  }
  }
  }
这是我的右手这是我的错误手
 

离线 Electr_Peter.

  • 支持者
  • ****
  • 帖子:964
  • 国家: LT.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#8开: 2016年3月19日,晚上10:04:38»
通过硬件装置考虑端口切换。如果需要仅输出(TX),则晶体管或开关IC将相对容易's。软件只能控制输出控制线处于活动状态,但将在MCU上使用单个串行端口。
 

离线 Jeroen3.

  • 超级贡献者
  • ***
  • 帖子:3625
  • 国家: NL.
  • 嵌入式工程师
    • Jeroen3..nl.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#9: 2016年3月19日,晚上11:01:43»
isn.'arduino阻止的一切?这将是它缓慢的根本原因。
获取一些循环缓冲区并中断事物中的例程!
 

离线 Psi..

  • 超级贡献者
  • ***
  • 帖子:7929
  • 国家: NZ.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#10: 2016年3月20日,12:47:45»
isn.'arduino阻止的一切?这将是它缓慢的根本原因。
获取一些循环缓冲区并中断事物中的例程!

+1为Arduino图书馆并阻止有趣是问题

只需从UART RX INT拍摄字符串并根据内容将其抽出各种软件串行输出,应琐碎。
您需要一个在您的软件波兰则上运行的计时器,因此您可以在定时器中断内部通过位进行数据位。
« 上次编辑:2016年3月20日,2016年12:49:50由PSI »
希腊信'Psi'(不是每平方英寸磅)
 

离线 botcrusher.

  • 常规贡献者
  • *
  • 帖子:192
  • 国家: 加利福尼亚州
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#11开: 2016年3月20日,12:56:04»
引用来自:abdullahseba

只需发送引脚数,然后发送字符串,例如:(7只猫)将通过PIN 7发送CAT,或者您可以说:(31CAT),它将在引脚31上发送CAT 31。


保持,如果您有许多引脚,则必须使用Arduino Mega,该Mega在Atmega2560上运行。我检查了哪个,有 4 USARTs

如果您需要更多的端口,并且需要更好的性能,我认为有一些基于集合的库(您可以通过C)可以真正挤出所有性能的库。

类似于ShiftOutfast的东西(但是对于串行)可能会挤奶您需要的性能。
 

离线 ade.

  • 支持者
  • ****
  • 帖子:231
  • 国家: 加利福尼亚州
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#12: 2016年3月20日,01:50:15 AM»
引用
+1为Arduino图书馆并阻止有趣是问题
即使通过阻塞功能,在串行读取和写入时,也不应该是1秒的延迟,当时'■只有一个输入流。

I'从来没有用过软件序列,但似乎开销是巨大的。 无论是或字符串函数都是非常效率的 - 也许只是使用字节阵列。 但没有一些分析它'很难说代码大部分时间都在哪里。
 

离线 Abdullahseba.

  • 频繁的贡献者
  • **
  • 帖子:335
  • 国家: GB.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#13开启: 2016年3月20日,上午10:19:47»
通过硬件装置考虑端口切换。如果需要仅输出(TX),则晶体管或开关IC将相对容易's。软件只能控制输出控制线处于活动状态,但将在MCU上使用单个串行端口。
那'一个想法,我生病了必须这样做或使用强大的微控制器。
这是我的右手这是我的错误手
 

离线 Abdullahseba.

  • 频繁的贡献者
  • **
  • 帖子:335
  • 国家: GB.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#14: 2016年3月20日,上午10:24:10»
引用来自:abdullahseba

只需发送引脚数,然后发送字符串,例如:(7只猫)将通过PIN 7发送CAT,或者您可以说:(31CAT),它将在引脚31上发送CAT 31。


保持,如果您有许多引脚,则必须使用Arduino Mega,该Mega在Atmega2560上运行。我检查了哪个,有 4 USARTs

如果您需要更多的端口,并且需要更好的性能,我认为有一些基于集合的库(您可以通过C)可以真正挤出所有性能的库。

类似于ShiftOutfast的东西(但是对于串行)可能会挤奶您需要的性能。
它有4个硬件USART,那'S软件串行的想法,允许您使用大多数数字输出作为串行端口。
这是我的右手这是我的错误手
 

离线 Slemanj.

  • 超级贡献者
  • ***
  • 帖子:2691
  • 国家: NZ.
  • 专业的紧身衣。
    • 电子爱好组件我销售。
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#15: 2016年3月20日,11:33:02»
失去了"String",请为Softwareserial对象使用数组。 

除了编译之外,未经测试。

使用strtol比ATOI和手动求寻求更好,但在Strtol中使用的双指针是混乱的。

代码: [选择]
#include <SoftwareSerial.h>

const byte numChannels = 3;
SoftwareSerial channels[numChannels] = { {2,3}, {4,5}, {6,7} };

void setup() {
  // put your setup code here, to run once:
  for(byte x = 0; x < numChannels; x++)
  {
    channels[x].begin(9600);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  char buffer[255];
  byte channelNumber = 0, i = 0;
 
  if(Serial.available())
  {
    Serial.readBytesUntil('\n', buffer, sizeof(buffer));
    if(buffer[0] >= '0' && buffer[0] <= '9')
    {
      // Convert the number at the start of the buffer to an integer
      channelNumber = atoi(buffer);

      // Scoot forward in buffer until we find the space
      for(byte i = 0; i < sizeof(buffer); i++)
      {
        if(buffer[i] == ' ')
        {
          i++;
          break;
        }
      }

      // i is now the index of the space (or we ran off the end
      if(i < sizeof(buffer))
      {
        channels[channelNumber].print(&buffer[i]);
      }
    }
  }
}
~~~
EEVBLOG会员 - 让自己 我所有的10%折扣 电子元器件出售 只需使用购买直接链接并使用优惠券代码"eevblog" during checkout. 来自新西兰的运费,国际订单欢迎:-)
 

离线 Abdullahseba.

  • 频繁的贡献者
  • **
  • 帖子:335
  • 国家: GB.
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#16开: PM 2016年3月20日,03:46:49»
失去了"String",请为Softwareserial对象使用数组。 

除了编译之外,未经测试。

使用strtol比ATOI和手动求寻求更好,但在Strtol中使用的双指针是混乱的。

代码: [选择]
#include <SoftwareSerial.h>

const byte numChannels = 3;
SoftwareSerial channels[numChannels] = { {2,3}, {4,5}, {6,7} };

void setup() {
  // put your setup code here, to run once:
  for(byte x = 0; x < numChannels; x++)
  {
    channels[x].begin(9600);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  char buffer[255];
  byte channelNumber = 0, i = 0;
 
  if(Serial.available())
  {
    Serial.readBytesUntil('\n', buffer, sizeof(buffer));
    if(buffer[0] >= '0' && buffer[0] <= '9')
    {
      // Convert the number at the start of the buffer to an integer
      channelNumber = atoi(buffer);

      // Scoot forward in buffer until we find the space
      for(byte i = 0; i < sizeof(buffer); i++)
      {
        if(buffer[i] == ' ')
        {
          i++;
          break;
        }
      }

      // i is now the index of the space (or we ran off the end
      if(i < sizeof(buffer))
      {
        channels[channelNumber].print(&buffer[i]);
      }
    }
  }
}
谢谢,但它没有't work I'M并不擅长编程以正确理解它。
这条线路完全是什么?软件系列通道[NumChannels] = {{2,3},{4,5},{6,7}};
这是我的右手这是我的错误手
 

离线 迈克利夫

  • 频繁的贡献者
  • **
  • 帖子:260
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#17开: 2016年3月20日,05:40:28 PM»
这条线路完全是什么?软件系列通道[NumChannels] = {{2,3},{4,5},{6,7}};
它创建了一系列3个软件'S用指定的Rx(2,4,6)和Tx(3,5,7)销。

http://stackoverflow.com/questions/9656576/how-can-i-initialize-an-array-of-objects-whose-constructor-require-two-or-more-a
 

离线 Boffin.

  • 支持者
  • ****
  • 帖子:995
  • 国家: 加利福尼亚州
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#18开启: 2016年4月16日,04:40:06 »
我有一个修补的软件串行,允许TX仅实现(或仅限RX)。  //github.com/snafu-ca/serial-gauge/tree/master/libraries/SoftwareSerial
 

离线 rstofer.

  • 超级贡献者
  • ***
  • 帖子:8118
  • 国家: 我们
Re:如何在Arduino上发送不同软件串行输出的串行命令?
« 回复#19: 2016年4月16日,05:30:27 PM»
跳过atoi(),只需掩盖比特0..3以外的所有内容

 ChannelNumber = Buffer [0]& 0x0f;

您已经知道字节是一个有效的数字

没有问题的情况'被处理的是频道的时候> numChannels
而不是测试<= '9',测试代表NumChannels的角色 - '3' in this case
也许设置chmax = numchannels +'0';
然后测试看起来像

  if(buffer[0] >= '0' && buffer[0] <= chMax)

除了一边,我可能会尝试类似的东西
 
  ch = buffer[0]
  if(ch >= '0' && ch <= chMax)

避免使用代码进行两次索引。 您希望GCC删除冗余计算,但除非您想查看大会列表,否则您可以't know that!  A minor issue... 特别是与软件串行相比。

 


分享我

掘客  Facebook  诽谤  可口的  Technorati.  推特  谷歌  雅虎
SMF.