您好,我正在尝试在 avr atmega32a 和 linux 发行版之间进行通信。我在 USB 端口上使用 ftdi 芯片(VCOM 驱动程序等)
我将在 avr 和 linux 中发布代码,但 avr 中的代码工作正常,因为我在 minicom 上对其进行了测试。
我认为这里的问题是我在 linux 上的代码。基本问题是它有时有效,有时无效。我认为它与文件描述符或端口本身的打开和关闭有关。
我为什么这么说?
avr 上的代码做了一件简单的事情。等待按钮被按下,然后开始永远发送“Hello world”。
所以当使用 minicom 时它工作得很好。
当我第一次使用我的程序并等待按钮被按下时,即使我按下按钮,我似乎也无法从端口读取任何内容。
然后我打开 minicom 并立即开始阅读(因为已按下按钮)。然后我关闭 minicom,我打开我的程序,它工作正常....
打开和关闭文件(端口)似乎有问题,但我不确定。反正这东西不够稳定。
任何帮助将不胜感激。
我要写的是从串口连续读取。我已经阅读了有关阻塞读取的信息,但是当我尝试实现它时它似乎不起作用。
谢谢。
更新* * 我刚刚添加了一个 else if (wordsRead < 0) printf("Error reading\n"); 第一次读取时它似乎得到-1,但我不明白为什么会发生这种情况问题是,当它从端口正确读取时(第一次使用 minicom 后)我在“Hello world”打印出来......
这是我的代码 AVR 唯一的主要功能。
int main()
{
uart_init();
//Set A0-6 as input, A7 as output
//Set as hexademical cause compiler does not support 0b
DDRA = 0x80;;
//Triggers up
PORTA = 0xFF;
while ((PINA & 0x1) == 1);
//Led on
PORTA &= 0x7F;
while (1){
uart_putstring("Hello world ");
}
}
这是我在linux上的C代码。
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
int main()
{
//Open Port
int fdSP= open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NDELAY);
if (fdSP == -1){
printf("Error opening serial port\n");
return 1;
}
// create the struct
struct termios options;
//Preferences
int BaudRate = 19200;
//Set Baud Rate
cfsetispeed(&options, BaudRate);
cfsetospeed(&options, BaudRate);
//Set Parity (No Parity)
options.c_cflag &= ~PARENB;
//Set Stop Bits (2 Stop Bits)
options.c_cflag &= CSTOPB;
//Set Data Bits (8 Data Bits)
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
if (tcsetattr(fdSP, TCSANOW, &options) != 0){
printf("Error applying settings to serial port\n");
return 1;
}
//Read Port
pid_t pid = fork();
if (pid < 0){
printf("Error creating child\n");
return 1;
}
else if (pid == 0){
raise(SIGSTOP);
int wordsRead;
char readSP;
while (1){
wordsRead = read(fdSP, &readSP, 1);
if (wordsRead > 0)
printf("%c", readSP);
else if (wordsRead < 0)
printf("Error reading\n");
}
}
else{
printf("Created a child to read from serial port\n");
printf("To kill the child open another terminal and type sudo kill %ld or press enter ok?", (long) pid);
getchar();
kill(pid, SIGCONT);
getchar();
kill(pid, SIGKILL);
if (close(fdSP) == -1){
printf("Error closing port\n");
return 1;
};
}
return 0;
}