G’day!
Я хочу отправить MIDI-байты в C ++ через последовательный порт. Я уже получаю данные. Единственная проблема заключается в том, что я получаю только 7 бит, и если я пытаюсь получить 2 байта, то биты не имеют смысла. Я получаю диапазон от 0 до 127, и я должен видеть цифры от 0 до 255.
Я храню данные в символе (1 байт). Я пробовал int и wchar_t, но все еще не работает.
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
unsigned char data_in[0];
int data_in_int;
int main(void){
int fd_serialport;
struct termios options;
fd_serialport = open("/dev/ttyACM0", O_RDONLY | O_NOCTTY);
//fd_serialport = open("/dev/ttyACM0", O_RDONLY | O_NOCTTY | O_NDELAY);if(fd_serialport == -1){
perror("Unable to open /dev/ttyACM0");
}
tcgetattr(fd_serialport, &options);
cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);
options.c_cflag |= (CLOCAL | CREAD);
//options.c_cflag |= PARENB;
//options.c_cflag |= PARODD;
//options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
//options.c_iflag |= (INPCK | ISTRIP);
tcsetattr(fd_serialport, TCSANOW, &options);
fcntl(fd_serialport, F_SETFL, 0);
usleep(1000000);
while(read(fd_serialport, &data_in[0], 1)){
data_in_int=(int)data_in[0];
printf("%i\n", data_in_int);
}
usleep(2000);
}
return(0);
Я использую Teensy (аналог Arduino) для отправки данных MIDI. На данный момент я просто проверяю, могу ли я получить номер. Я знаю, что подростки работают, потому что другие программы правильно интерпретируют данные (чистые данные). Я работаю с Ubuntu 12.04 LTS.
Я пытался отправить цифры от -255 до 255. Код подростка:
int indx=-256;
void setup(){
Serial.begin(38400);
}
void loop(){
Serial.print(indx,BYTE);
delay(200);
indx++;
if (indx==256) indx=-256;
}
Вы знаете, почему я не могу получить весь байт? Я пробовал разные конфигурации для termios.options и fcntl. Вы думаете, что лучше попробовать какую-нибудь другую библиотеку?
Спасибо!
pd: я также понял, что некоторые числа между 0 и 127 не интерпретируются программой. Это числа 3, 17, 19 и некоторые другие, которые я не могу вспомнить.
Я работал раньше со всеми строками, чтобы установить termios.options. Я написал их как комментарии позже. Поскольку я не изменил состояние termios, комментарий не изменил настройки порта. Похоже, что одна из этих строк или некоторые из них используют 1 бит байта. После перезагрузки компьютера все заработало, и я мог получить цифры от 0 до 255!
//options.c_cflag |= PARENB;
//options.c_cflag |= PARODD;
//options.c_cflag &= ~CSTOPB;
//options.c_iflag |= (INPCK | ISTRIP);
У меня все еще проблемы с 3, 17 и 19. Я не могу прочитать эти цифры, и программа, похоже, ничего не получает. У кого-нибудь есть идеи, почему это может происходить?
Я выложу числа в двоичном виде, возможно, у кого-то есть идея:
00000011 -- 3
00010001 -- 17
00010011 -- 19
Других решений пока нет …