Кажется, есть странная проблема, с которой я столкнулся при работе с UART на Raspberry Pi. Проблема проста, я инициализирую UART, как показано Вот и установите скорость в 9600 бод, и даже передача первых нескольких байтов идет хорошо. Однако через некоторое время, когда я постоянно продолжаю отправлять данные, RPi показывает на экране следующее сообщение: Невозможно открыть UART. Убедитесь, что оно не используется другим приложением.
Я не знаю, что я делаю не так и все усложняю, я столкнулся с этой проблемой пару дней назад, до этого код работал без ошибок в течение длительного периода времени.
Вот фрагмент кода:
minMaxLoc( diffImg, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
xpos=maxLoc.x;
ypos=maxLoc.y;
xposs = xpos - xposp;
yposs = ypos - yposp;
xposp = xpos;
yposp = ypos;
char x_tx_buffer[20], y_tx_buffer[20];
char x_dummy_buffer[20];
char y_dummy_buffer[20];
char *p_x_tx_buffer, *p_y_tx_buffer;
sprintf(x_dummy_buffer,"%d", (int)(abs(xposs*2.5)));
sprintf(y_dummy_buffer,"%d", (int)(abs(yposs*2.5)));
p_x_tx_buffer = &x_tx_buffer[0];
*p_x_tx_buffer++ = x_dummy_buffer[0];
*p_x_tx_buffer++ = x_dummy_buffer[1];
*p_x_tx_buffer++ = x_dummy_buffer[2];
*p_x_tx_buffer++ = x_dummy_buffer[3];
p_y_tx_buffer = &y_tx_buffer[0];
*p_y_tx_buffer++ = y_dummy_buffer[0];
*p_y_tx_buffer++ = y_dummy_buffer[1];
*p_y_tx_buffer++ = y_dummy_buffer[2];
*p_y_tx_buffer++ = y_dummy_buffer[3];
uart0_filestream = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY); //Open in non blocking read/write mode
if (uart0_filestream == -1)
{
//ERROR - CAN'T OPEN SERIAL PORT
printf("Error - Unable to open UART. Ensure it is not in use by another application\n");
}
if (uart0_filestream != -1)
{
int countx = write(uart0_filestream, &x_tx_buffer[0], (p_x_tx_buffer - &x_tx_buffer[0])); //Filestream, bytes to write, number of bytes to write
int county = write(uart0_filestream, &y_tx_buffer[0], (p_y_tx_buffer - &y_tx_buffer[0])); //Filestream, bytes to write, number of bytes to write
if (countx < 0 || county < 0)
{
printf("UART TX error\n");
}
}
Куда я иду не так?
Вы должны сделать это в конце процедуры.
close(uart0_filestream);
Других решений пока нет …