我試圖從BeagleBone Black上的串行端口(/dev/ttyS4
)讀取,但我認爲(?)這應該適用於所有Linux設備。Linux串行讀取塊minicom
目前,我可以設置minicom
的波特率爲9600和8N1的數據從串口讀取正確。但是,如果我直接嘗試cat /dev/ttyS4
,則在我的終端中不會顯示任何內容。我的代碼也這樣做,並返回一個Resource temporarily unavailable
錯誤,我懷疑是cat
命令發生了什麼。
如果我跑stty -F /dev/ttyS4
,我得到下面的輸出(其中,據我所知道的,是我的minicom
設置一致):
speed 9600 baud; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>;
-brkint -imaxbel
-opost -onclr
-isig -iexten -echo -echoe -echok -echoctl -echoke
一個有趣的注意的是,當我有minicom
開放,如果我開始執行程序,minicom將停止打印任何內容,即使停止執行程序,也會保持這種狀態。我需要再次打開串行設置(Ctrl-A
,P
),並關閉minicom
以恢復工作(似乎沒有任何更改)。
我的代碼如下:
int main() {
std::cout << "Starting..." << std::endl;
std::cout << "Connecting..." << std::endl;
int tty4 = open("/dev/ttyS4", O_RDWR | O_NOCTTY | O_NDELAY);
if (tty4 < 0) {
std::cout << "Error opening serial terminal." << std::endl;
}
std::cout << "Configuring..." << std::endl;
struct termios oldtio, newtio;
tcgetattr(tty4, &oldtio); // save current serial port settings
bzero(&newtio, sizeof(newtio)); // clear struct for new settings
newtio.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
tcflush(tty4, TCIFLUSH);
tcsetattr(tty4, TCSANOW, &newtio);
std::cout << "Reading..." << std::endl;
while (true) {
uint8_t byte;
int status = read(tty4, &byte, 1);
if (status > 0) {
std::cout << (char)byte;
} else if (status == -1) {
std::cout << "\tERROR: " << strerror(errno) << std::endl;
}
}
tcsetattr(tty4, TCSANOW, &oldtio);
close(tty4);
}
編輯:我已經按照Adafruit的的教程使用python與BeagleBone得到串口正常工作(在python)。此時我確定我是做錯了事;問題是什麼。我更願意使用C++而不是Python,因此能夠很好地工作。
我看到幾個可能的問題,但是你的問題是什麼? – sawdust
我該如何修改我的C++程序才能成功從串口讀取數據? –