软串口(SoftwareSerial)的模拟和解析-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5160|回复: 4

软串口(SoftwareSerial)的模拟和解析

[复制链接]
发表于 2021-7-19 23:56 | 显示全部楼层 |阅读模式
本帖最后由 topdog 于 2021-7-20 00:55 编辑

设问外部发送数据FA E0 10 00 67 02 A8 0A 18 19 F3 FF A2 F3 AE 16 25 0E 10 EC AF D1 AD 9B,捕获67 02这两个字节位置的内容,两个字节需要调换位置变为02 67,最终十进制结果是615。
为了比较直观的演示发射端和接收端的工作状态,本列使用两个nano和一根杜邦线线来做实验,接线图如下:
字符解析模拟1.jpg


发射端程序:

[pre]#include <SoftwareSerial.h>   

const int  RxD = 2;
const int TxD = 3;

String inputstring_one = "FA E0 10 00 67 02 A8 0A 18 19 F3 FF A2 F3 AE 16 25 0E 10 EC AF D1 AD 9B";
String inputstring_two = "FA E0 10 00 97 02 A8 0A 18 19 F3 FF A2 F3 AE 16 25 0E 10 EC AF D1 AD 9B";

SoftwareSerial mySerial(RxD, TxD);

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);  
  Serial.println("RX modules");
}

void loop()
{
  mySerial.println(inputstring_one);
  delay(200);
  mySerial.println(inputstring_two);
  delay(200);
}[/pre]


接收端程序:
参见我的文章《串口接收十六进制代码控制点灯》,《Arduino16进制字符串转ASCII(下)》,单频电波钟接收模块解析中国码(BPC码) (下),这里就不在介绍字符串函数的应用和解析了。
上述文章没有涉及的知识点:

(1)、flush函数可让开发板在所有待发数据发送完毕前,保持等待状态。打个比喻就是口令“稍息”,但是它不具有清除串口接收缓冲区中信息的功能,而是由read函数来完成,(mySerial.read() == -1。

(2)、发射端使用println发射一串字符串,最后会加上'\r\n"标明回车换行。'\r'表示回车(Carriage return),使光标下移一格。'\n'表示换行(New line),使光标到行首。所以接收端接收这串字符串使用函数readStringUntil(terminator),缺省值terminator: 终止字符。用于设置终止函数执行的字符信息。设备在读取数据时一旦读取到此终止字符,将会结束函数执行。允许使用char类型。本列就是尾巴'\n'啦!

[pre]#include <SoftwareSerial.h>

char terminatorChar = '\n';
String inputString = "";
const int  RxD = 2;
const int TxD = 3;

SoftwareSerial mySerial(RxD, TxD);

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println("TX modules");
}

void loop()
{
  while (mySerial.available() > 0) {
    String inputString = mySerial.readStringUntil(terminatorChar);
    Serial.println(inputString);
    char First = inputString.charAt(15);
    char Second  = inputString.charAt(16);
    char Third  = inputString.charAt(12);
    char Fourth  = inputString.charAt(13);
    int Val = HexChangeDec(First) * 16 * 16 * 16 + HexChangeDec(Second) * 16 * 16 + HexChangeDec(Third) * 16 + HexChangeDec(Fourth);
    Serial.println(Val);   
  }

  /*
  if (mySerial.read() == -1){
    Serial.println("Incoming Buffer is Clear.");
  }
  */

    inputString = "";
    Serial.flush();
    mySerial.flush();
  }


int HexChangeDec(char ch)
{
  return (ch - '0' > 10) ? ch - '0' - 7 : ch - '0';
}[/pre]

实现效果如图:
解析字符2.jpg



发表于 2021-8-2 20:15 | 显示全部楼层
大大,假如我需要的是02的低5位,这种情况您可以给我讲讲吗,我理解的是您是按位转化成整数,但这种还可以直接&1F吗
 楼主| 发表于 2021-8-2 23:18 | 显示全部楼层
本帖最后由 topdog 于 2021-8-3 00:38 编辑
sjdynake 发表于 2021-8-2 20:15
大大,假如我需要的是02的低5位,这种情况您可以给我讲讲吗,我理解的是您是按位转化成整数,但这种还可以 ...

如果碰到String转byte,那么我们首先将String转换为int,然后再进行处理,处理的时候按照16进制进行移位处理。
发表于 2022-5-6 20:35 | 显示全部楼层
这样的方式 你发送的本身就是字符串 ,不是16进制的数据
 楼主| 发表于 2022-5-6 21:09 | 显示全部楼层
haiden 发表于 2022-5-6 20:35
这样的方式 你发送的本身就是字符串 ,不是16进制的数据

发送的只是1和0,懂了吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 00:29 , Processed in 0.405819 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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