gpt4 book ai didi

c - 从/dev/ttyACM0 读取时出现段错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:40:16 25 4
gpt4 key购买 nike

我正在尝试用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com