TL; DR-我正在尝试使用我发现here的代码与Arduino进行串行通信,但没有发送任何内容(Arduino已编程为响应,并且我检查了它是否与串行监视器兼容)
你好, 我一直在寻找一种使用C ++通过Linux串行端口将信息发送到Arduino Mega(2560)单元的方法。
我遇到了以下解决方案:Solution 我正在使用此人的代码进行写操作(我能够从arduino读取数据)并使用相同的参数(它们起作用了,因为我能够从Ardunio接收数据)。 我将Arduino编程为每当看到至少1位信息时就通过串行发送“ Hi”,然后通过Arduino IDE串行监视器检查其是否工作。
但是,当运行C ++代码时,arduino不会响应。有人知道为什么吗?
全面披露-我将@ Lunatic999的代码插入到一个类中,以便我可以根据自己的代码需要为其创建一个实例。
fd = open(portNameC, O_RDWR | O_NOCTTY | O_SYNC); //open port ("opens file")
序列参数:
struct termios tty;
struct termios tty_old;
memset (&tty, 0, sizeof tty);
/* Error Handling */
if ( tcgetattr ( fd, &tty ) != 0 ) {
std::cout << "Error " << errno << " from tcgetattr: " << strerror(errno) << std::endl;
}
/* Save old tty parameters */
tty_old = tty;
/* Set Baud Rate */
cfsetospeed (&tty, (speed_t)B19200);
cfsetispeed (&tty, (speed_t)B19200);
/* Setting other Port Stuff */
tty.c_cflag &= ~PARENB; // Make 8n1
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS; // no flow control
tty.c_cc[VMIN] = 1; // read doesn't block
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
tty.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
/* Make raw */
cfmakeraw(&tty);
/* Flush Port, then applies attributes */
tcflush( fd, TCIFLUSH );
if ( tcsetattr ( fd, TCSANOW, &tty ) != 0) {
std::cout << "Error " << errno << " from tcsetattr" << std::endl;
}
写入(此代码已放入我调用的函数中)
unsigned char cmd[] = "INIT \r";
int n_written = 0,
spot = 0;
do {
n_written = write( fd, &cmd[spot], 1 );
spot += n_written;
} while (cmd[spot-1] != '\r' && n_written > 0);
Arduino代码:
bool dataRecieved = false;
int ledpin = 13;
void setup() {
pinMode(ledpin, OUTPUT);
digitalWrite(ledpin, HIGH);
Serial.begin(19200);
}
void loop() {
while(!dataRecieved)
{
digitalWrite(ledpin,HIGH);
if (Serial.available() > 0)
{
dataRecieved = true;
}
}
digitalWrite(ledpin,LOW);
delay(1000);
digitalWrite(ledpin,HIGH);
delay(1000);
Serial.println("hi");
}
答案 0 :(得分:0)
原来,这一直是一个难题。我需要睡些时间才能让arduino引导加载