如何用PC给arduino发送整型数组?求助-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 510|回复: 8

[已解决] 如何用PC给arduino发送整型数组?求助

[复制链接]
发表于 2022-5-18 19:31 | 显示全部楼层 |阅读模式
本帖最后由 delo 于 2022-5-19 00:00 编辑

本人写了一个python给arduino发送数组的串口通信,但是有两个问题困扰着我,想问问各位大佬。

1. python这边打印的我发送的数据是字节类型的
    发送的代码  servoCOM3.write(val.encode('utf-8'))
    val.encode('utf-8')   打印出来是    b'[[0, 1], [2, 3], [4, 15], [6, 7]]'
    我想知道开发板收到的数据也是b'[[0, 1], [2, 3], [4, 15], [6, 7]]'这个吗?

2. 还想问问arduino这边想接收这个数组的话,怎么写比较好,因为如果用Serial.parseInt(),会只剩下数字,无法判断哪个数字是数组哪一位的。
   但是如果用Serial.read去读,读出字符串,但是数字可能是一位也可能是两位例如b'[[10, 12], [23, 33], [43, 15], [36, 72]]'这种,就不能用字符串的定位去获取数字了,求助各位大佬。
发表于 2022-5-18 23:11 | 显示全部楼层
delo 发表于 2022-5-18 22:14
你好,这是我得代码,我用arduino的IDE自带的串口调试是没问题的,但是一直都是用python连接的时候,第 ...

你这是另外的问题了。。。https://www.zhihu.com/question/450290003 ,有人说是IDE的问题。实测命令行下python的确是正常的。解决嘛。。。粗暴点,python串口初始化后立即读一次,并不处理。
1.png
发表于 2022-5-18 19:52 | 显示全部楼层
串口概念很老,有很多有意思的话题,最早的硬件串口通讯还有握手信号,可以保证接收结束才传下一个。现在基本上 RxTx 两个数字口就能通讯,盲发到对方串口缓冲区,Serial.readString()把整个串口缓冲区读出来,去处理这个 string。 这样难度就转换为字符串处理了。比如识别特定的分割符,起始符等。比如搜一下“[Arduino] 逗号分隔文本到数组的两种方法”。
 楼主| 发表于 2022-5-18 20:33 | 显示全部楼层
kpj001 发表于 2022-5-18 19:52
串口概念很老,有很多有意思的话题,最早的硬件串口通讯还有握手信号,可以保证接收结束才传下一个。现在基 ...

谢谢大佬解答,我大概知道你的思路了,我刚刚在解决问题1 的时候,想利用电脑先给开发板发数据,然后开发板收到数据之后,在发给电脑,以此来判断,开发板接收到的数据类型和样式,但是为什么开发板却没有发送回来呢?请问需要我贴上代码吗?
发表于 2022-5-18 21:37 | 显示全部楼层
本帖最后由 topdog 于 2022-5-18 23:19 编辑

用软串口先read一下所有的数据,再去截取。b'[[10, 12], [23, 33], [43, 15], [36, 72]]'  以此为例:10就是截取第4,5个字节。

1,截取各段数字:

[pre]String inputString = "b'[[10,12],[23,33],[43,15],[36,72]]'";

void setup()
{
  Serial.begin(9600);
  int one = inputString.substring(4, 6).toInt();
  int two = inputString.substring(7, 9).toInt();
  int three = inputString.substring(12, 14).toInt();
  int four = inputString.substring(15, 17).toInt();
  int five = inputString.substring(20, 22).toInt();
  int six = inputString.substring(23, 25).toInt();
  int seven = inputString.substring(28, 30).toInt();
  int eight = inputString.substring(31, 33).toInt();

  Serial.print("one \t = \t ");
  Serial.println(one);
  Serial.print("two \t = \t ");
  Serial.println(two);
  Serial.print("three \t = \t ");
  Serial.println(three);
  Serial.print("four \t = \t ");
  Serial.println(four);
  Serial.print("five \t = \t ");
  Serial.println(five);
  Serial.print("six \t = \t ");
  Serial.println(six);
  Serial.print("seven \t = \t ");
  Serial.println(seven);
  Serial.print("eight \t = \t ");
  Serial.println(eight);
}

void loop() {}[/pre]

2实现结果

串口输出.PNG


3,软串口接python的程序:

[pre]#include <SoftwareSerial.h>;

char terminatorChar = "'";

SoftwareSerial PY_Serial(2, 3);

void setup()
{
  Serial.begin(115200);
  PY_Serial.begin(115200);
}

void loop() {
  String inputString = "";

  if (PY_Serial.available() > 0) {
    inputString = PY_Serial.readStringUntil(terminatorChar);
    Serial.println(inputString);
    delay(100);

    int one = inputString.substring(4, 6).toInt();
    int two = inputString.substring(7, 9).toInt();
    int three = inputString.substring(12, 14).toInt();
    int four = inputString.substring(15, 17).toInt();
    int five = inputString.substring(20, 22).toInt();
    int six = inputString.substring(23, 25).toInt();
    int seven = inputString.substring(28, 30).toInt();
    int eight = inputString.substring(31, 33).toInt();

    Serial.print("one \t = \t ");
    Serial.println(one);
    Serial.print("two \t = \t ");
    Serial.println(two);
    Serial.print("three \t = \t ");
    Serial.println(three);
    Serial.print("four \t = \t ");
    Serial.println(four);
    Serial.print("five \t = \t ");
    Serial.println(five);
    Serial.print("six \t = \t ");
    Serial.println(six);
    Serial.print("seven \t = \t ");
    Serial.println(seven);
    Serial.print("eight \t = \t ");
    Serial.println(eight);
  }
}[/pre]

3,硬体串口输入程序:

[pre]char terminatorChar = "'";

void setup() {
  // 启动串口通讯
  Serial.begin(115200);
  Serial.println();
}

void loop() {

  if (Serial.available()) {
    Serial.println("Please enter sting:");

    String inputString = Serial.readStringUntil(terminatorChar);
    Serial.print("Received Serial sting: ");
    Serial.println(inputString);

    int one = inputString.substring(4, 6).toInt();
    int two = inputString.substring(7, 9).toInt();
    int three = inputString.substring(12, 14).toInt();
    int four = inputString.substring(15, 17).toInt();
    int five = inputString.substring(20, 22).toInt();
    int six = inputString.substring(23, 25).toInt();
    int seven = inputString.substring(28, 30).toInt();
    int eight = inputString.substring(31, 33).toInt();

    Serial.print("one \t = \t ");
    Serial.println(one);
    Serial.print("two \t = \t ");
    Serial.println(two);
    Serial.print("three \t = \t ");
    Serial.println(three);
    Serial.print("four \t = \t ");
    Serial.println(four);
    Serial.print("five \t = \t ");
    Serial.println(five);
    Serial.print("six \t = \t ");
    Serial.println(six);
    Serial.print("seven \t = \t ");
    Serial.println(seven);
    Serial.print("eight \t = \t ");
    Serial.println(eight);
  }
}[/pre]

4,实际测试结果:

串口实测.PNG


可以参考:
https://www.arduino.cn/thread-104826-1-1.html

https://www.arduino.cn/thread-102084-1-1.html

https://www.arduino.cn/thread-102053-1-1.html




发表于 2022-5-18 21:46 | 显示全部楼层
delo 发表于 2022-5-18 20:33
谢谢大佬解答,我大概知道你的思路了,我刚刚在解决问题1 的时候,想利用电脑先给开发板发数据,然后开发 ...


自带的串口例程都略复杂了,用图上这个先感受下“串口通讯”的一点点最简单的回传,然后再去考虑其他问题。这几行程序都跑不出图上结果则拉出去打PP
1.png
 楼主| 发表于 2022-5-18 22:14 | 显示全部楼层
kpj001 发表于 2022-5-18 21:46
自带的串口例程都略复杂了,用图上这个先感受下“串口通讯”的一点点最简单的回传,然后再去考虑其他问 ...

1652883122(1).jpg
你好,这是我得代码,我用arduino的IDE自带的串口调试是没问题的,但是一直都是用python连接的时候,第一段,永远无法正常获取数据,不知道为啥
 楼主| 发表于 2022-5-18 23:58 | 显示全部楼层
topdog 发表于 2022-5-18 21:37
用软串口先read一下所有的数据,再去截取。b'[[10, 12], [23, 33], [43, 15], [36, 72]]'  以此为例:10就 ...

非常感谢,你的答案帮助我提供了思路,但是软串口的话,我这里没有可以使用的数据线去使用,只能使用硬串口,不过我觉得截取获取数据的思路很不错。
 楼主| 发表于 2022-5-18 23:59 | 显示全部楼层
kpj001 发表于 2022-5-18 23:11
你这是另外的问题了。。。https://www.zhihu.com/question/450290003 ,有人说是IDE的问题。实测命令行下 ...

ok,非常感谢
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 05:43 , Processed in 0.181798 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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