天儿真好! 我想通过串口将midi字节发送到C ++。我已经收到了数据。唯一的问题是我只收到7位,如果我试图得到2个字节,这些位没有意义。我收到的范围在0到127之间,我应该可以看到0到255之间的数字。
我将数据存储在char(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数据。目前我正在进行测试,看看能否得到这个数字。我知道teensy工作,因为其他程序正确解释数据(纯数据)。我正在使用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和其他一些我不记得了。
答案 0 :(得分:1)
我之前正在使用所有行来设置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