Привет, я пытаюсь установить связь между avr atmega32a и дистрибутивом linux. Я использую чип ftdi на USB-порту (драйверы VCOM и т. Д.)Проблемы с последовательным портом на linux, между avr и linux
Я выложу коды в avr и linux, но код в avr отлично работает, поскольку я тестировал его на minicom.
Я предполагаю, что проблема здесь в моем коде на linux. Основная проблема заключается в том, что она иногда работает, иногда не работает. Я предполагаю, что это имеет какое-то отношение к открытию и закрытию дескриптора файла или самого порта.
Почему я говорю это?
Код на avr делает простую вещь. Ожидает нажатия кнопки, а затем начинает отправлять «Hello world» навсегда.
Так что при использовании minicom он работает отлично.
Когда я использую свою программу в первый раз и жду, чтобы кнопка нажата, я, похоже, не могу ничего читать с порта, даже если я нажму кнопку.
Затем я открываю миникомпьютер и сразу начинает считывать (потому что кнопка нажата). Затем я закрываю minicom, я открываю свою программу, и она отлично работает.
Кажется, что возникают проблемы с открытием и закрытием файла (порта), но я не уверен. В любом случае эта вещь недостаточно стабильна.
Любая помощь была бы признательна.
То, что я хочу написать, - это постоянное чтение из последовательного порта. Ive читал о блокировании чтения, но когда я пытаюсь его реализовать, он, похоже, не работает.
Спасибо.
UPDATE * * Я просто добавил еще, если (wordsRead < 0) Е ("Ошибка чтения \ п"); Кажется, что он получает -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 ");
}
}
Вот мой код C на linux.
#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;
}
Почему вилка? Попробуйте удалить вилку и запустить ее, чтобы уменьшить пространство проблем. –
Правильны ли настройки порта? 'minicom' устанавливает настройки в первый раз, затем ваша программа использует их. Возможно, вам что-то не хватает. –
Сначала вы должны использовать 'tcgetattr', чтобы заполнить структуру termios. Теперь он полон мусора. –