我正在开发一个小型 Linux 服务器(在 Beagleboard xM ARM 计算机上运行的 Ubuntu Server 13.04),它将在笔记本电脑和 Arduino 之间进行无线通信。我似乎遇到的问题是关于 Arduino 和 Beagleboard 之间的通信。该程序将运行一段时间,大约 30 秒左右,然后它会停止。该程序将继续运行,但端口显然冻结。
我正在运行的程序目前只是一个测试程序,它将在一定范围内扫描伺服。用于设置端口的函数代码可在此处找到。
我的程序代码如下,除了在单独线程中找到的代码:
#include <errno.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
using namespace std;
...
int main (int argc, const char* argv[]) {
cout << "TestIO running...\n";
char* portname = "/dev/ttyACM0";
// Open serial port
int fd = open(portname, O_RDWR | O_NOCTTY | O_SYNC);
// Return error if port cannot be opened
if (fd < 0)
{
cout << "error " << errno << " opening " << portname << ": " << strerror (errno) << "\n";
return -1;
}
set_interface_attribs (fd, B9600, 0); // set speed to 9600 bps, 8n1 (no parity)
set_blocking (fd, 0); // set no blocking
// Read from serial port
//char inputBuffer[64];
//int inputLength = read(fd, inputBuffer, sizeof inputBuffer);
double output = 575;
char outputString[255];
char outputLength;
int incrimentor = 1;
char inChar;
for(;;) {
if (output >= 675 )
incrimentor = -1;
else if (output <= 375)
incrimentor = 1;
output += incrimentor;
// Sweep wheels on car, set drive motor to 0
outputLength = sprintf(outputString, "%0.2f", output);
write(fd, outputString, outputLength);
write(fd, ",", 1);
write(fd, "0", 1);
write(fd, "\n", 1);
cout << outputString << "\n";
// Sleep thread for 5000 uS (5 ms)
usleep(5000);
}
close(fd);
return 0;
}
稍微不同的是,当程序冻结时,我必须强制它退出代码以关闭端口,因此我无法再次运行程序来测试它。我很好奇是否有人知道如何通过在终端中运行的 Linux 命令关闭串行端口。
谢谢!