- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试用 arduino UNO 和 C 程序之间的通信做一个小实验。
首先是arduino角色:我的 arduino 设置为每 2 秒从光敏电阻读取一个模拟值,然后将该值写入串行端口(我的系统上为/dev/ttyACM0)。
这是arduino的草图:
/*
This program will read analog data from a photo resistor and
will write it to the serial port.
*/
#define LIGHTPIN 0
#define DELAY 2000
void setup()
{
Serial.begin(9600);
Serial.flush();
}
void loop()
{
int lightvalue = 0;
lightvalue = map(analogRead(LIGHTPIN), 0, 1023, 1, 100);
Serial.println(lightvalue);
delay(DELAY);
}
arduino 的草图工作正常;它不断地读取数据并将其写入串口。我可以使用串行监视器查看它们。
然后是C程序。该程序应该访问/dev/ttyACM0 并读取数据。它将数据存储在一个变量中并打印出来。我在 ArchLinux 系统上,所以要访问端口,我想将/dev/ttyACM0 作为文件打开。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <stdint.h>
#define DELAY 2
int main(int argc, char *argv[])
{
FILE *serialport = NULL;
uint8_t lightval = 0;
uint8_t lastval = 0;
if ( argc < 2 ) {
fprintf(stderr, "Too few arguments.\n");
exit(EXIT_FAILURE);
}
if ( !(serialport = fopen(argv[1], "r")) ) {
fprintf(stderr, "Couldn' t open serial port for communication.\n");
exit(EXIT_FAILURE);
}
while ( true ) {
fscanf(serialport, "%u", &lightval);
if ( lightval != lastval ) {
printf("%u\n", lightval);
lastval = lightval;
}
while (getc(serialport) != '\n')
continue;
sleep(DELAY);
}
fclose(serialport);
}
问题来了。当我运行测试时,它读取并打印第一个值很好,但在读取第二个值时会出现段错误。
我其实不明白我做错了什么。这可能很愚蠢,但我似乎无法理解。
所以我的问题是:我的测试有什么问题?
提前感谢谁会帮助我
最佳答案
“段错误”通常仅在您触摸指向无效内存的指针或将不正确的类型或数量的参数传递给函数时才会发生。
在每种情况下,从她开始的第一件事就是使用 -Wall -Werror 进行编译,看看是否收到任何应该处理的警告。 (事实上 ,您应该始终这样做。)
作为第二步,在生成的核心转储上运行 gdb 并进行回溯——查看您正在执行的导致段错误的确切操作。然后很明显是什么变量访问导致了问题。
在这个特定的实例中 我认为问题出在您的 scanf 调用上——您将 %u 与一个八位值结合使用,它可能会占用内存的所有部分结果不应该。然而,如何调试这些东西的一般原则远比你在这里遇到的特定问题重要得多——我会假装我没有告诉你它可能是什么,看看打开警告和使用 gdb 是否没有意义你的问题。总有一天您需要知道如何再次这样做。
关于c - 从/dev/ttyACM0 读取时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9524430/
我有一个脚本可以从连接在以下位置的外部爱立信 F3507gw 调制解调器获取信号强度: ttyACM0: mobile broadband data modem ttyACM1: mobile bro
他们的命令是否返回打开的/dev/ttyACM*。在脚本的某个阶段,它断开 USB 连接并重新连接,但 ACM 在此之后递增,因此变量 port =/dev/ttyACM0 现在是 /dev/ttyA
下午好 我有一个外围设备,它通过虚拟串行端口通过 USB 进行通信。使用通用 ACM 串行驱动程序在 Windows 下一切正常,例如:https://www.kernel.org/doc/Docum
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我是一名优秀的程序员,十分优秀!