multithreading - 使用Arduino从串口读取提供垃圾输出
问题描述
我目前正在尝试使用多线程通过 Arduino 从串行端口读取输入。我有两个线程从串口读取,它们都在读取相同的东西(忽略它们的函数名)。这是代码:
func readFirstLine(scanner *bufio.Scanner, port *serial.Port){
for scanner.Scan() {
log.Printf("%q\n", scanner.Text())
}
time.Sleep(time.Duration(1)*time.Second)
}
func readSecondLine(scanner *bufio.Scanner, port *serial.Port){
time.Sleep(time.Duration(1)*time.Second)
for scanner.Scan() {
log.Printf("%q\n", scanner.Text())
}
}
func main() {
usbRead := &serial.Config{Name: "COM5", Baud: 9600, ReadTimeout: 0}
port, err := serial.OpenPort(usbRead)
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(port)
for true {
go readFirstLine(scanner, port)
go readSecondLine(scanner, port)
time.Sleep(time.Duration(2)*time.Second)
}
}
我期望输出看起来像这样:
{"temperature":[26,26],"humidity":[54.2,54.2],"sensor":"DHT22"}
{"temperature":[23.46041,23.46041],"sensor":"LM35DZ"}
{"blink":["true","true"],"actuator":"arduinoLED"}
{"temperature":[26,26],"humidity":[54.2,54.2],"sensor":"DHT22"}
{"temperature":[23.46041,23.46041],"sensor":"LM35DZ"}
{"blink":["true","true"],"actuator":"arduinoLED"}
然而,我在预期输出之间得到了垃圾输出:
"{\"temperature\":[23.46041,23.46041,23.46041],\"sensor\":\"LM35DZ\"}"
"{\"blink\":[\"true\",\"true\",\"true\"],\"actuator\":\"arduinoLED\"}"
"mpeer\x00\x00re\"u:\x00\x00[]6\x00midhui\x00\x00[54\":.\x00\x00sen,\"s\x00\x00:or\"\"TH\x00"
{\"}\"\x00\x00ptemurrate\x003.4[26\x00\x00,\"s1]e\x00\x00\":\"orL\x00\x00Z\"}5D\r\x00\x00\x00"
我相信这个垃圾输出会出现,因为即使 Arduino 没有输出任何东西,我也在读取串行端口输入。关于如何解决这个问题有什么想法吗?谢谢。
解决方案
bufio.Scanner
您在没有同步机制的情况下同时读取和写入 a 。
推荐阅读
- javascript - Javascript 像 Java 8 上的“Promise.all”(可能带有 lambdas)
- javascript - 在数组中显示偶数和奇数
- java - 我正在尝试在实际月份 1 之前获取星期一的日期
- python - 如何使用一个 git clone 项目作为另一个 git 项目的导入库
- vue.js - Vue删除数组中的最后一项而不是ID
- xcode - Xcode中定义的宏CURRENT_PROJECT_VERSION在哪里?
- node.js - 使用 HTTPS 运行节点
- firebase - 无法从 NodeMCU 中的 firebase 读取数据
- java - 按钮不返回动作
- angular - 当使用 *ngFor 的项目数组发生变化时如何渲染所有子元素