linux关机重启机器人,Linux Stopped (tty output) 问题
在Linux下便遇到一個問題,讓進程使用& 在后臺運行時,輸入enter,會導致 tty stopped 導致程序不能進行。
因為在該進程有用到串口的讀取和發送了,tty串口的讀寫功能喪失。
后來 將?SIGTTOU 忽略掉,signal(SIGTTOU, SIG_IGN);
結果發現不再提示? tty stopped了 ,但是tty串口功能仍舊不能使用。
tty stopped的根本原因是因為在串口在使用當中用到了終端輸出功能,然后再從終端讀取數據,如果忽略掉,在實際用用中 ,進入后臺后,
終端的輸入輸出將會受到一定的影響,所以還要檢查串口的配置問題。
最后發現在串口的配置如下
{
int fd = -1;
int iRet;
int iFd;
struct termios options;
struct serial_struct serial;
/* Start: If need, to modify uart dcb config */
ST_UARTDCB dcb = {
.flowctrl = FC_NONE,//none flow control
.databit = DB_CS8,//databit: 8
.stopbit = SB_1,//stopbit: 1
.parity = PB_NONE,//parity check: none
.baudrate = B_460800//baudrate: 115200
};
if (460800 == baudrate)
dcb.baudrate = B_460800;
fd = Ql_UART_Open(dev_name, baudrate, O_RDWR |FC_NONE|O_NONBLOCK );
DEBUG(LOG_DEBUG,"%s open(\"%s\", %d) = %d\n", PROCESS_NAME, MAIN_UART_DEV, baudrate, fd);
/* if need, to modify uart dcb config */
iRet = Ql_UART_SetDCB(fd, &dcb);
//DEBUG(LOG_DEBUG,"SET DCB ret: %d\n", iRet);
iRet = Ql_UART_GetDCB(fd, &dcb);
DEBUG(LOG_DEBUG,"%s GET DCB ret: %d: baudrate: %d, flowctrl: %d, databit: %d, stopbit: %d, paritybit: %d\n",
PROCESS_NAME, iRet, dcb.baudrate, dcb.flowctrl, dcb.databit, dcb.stopbit, dcb.parity);
#if 0
Ql_UART_IoCtl(fd, TIOCGSERIAL, &serial);
serial.xmit_fifo_size = FIFO_SIZE; // what is "xmit" ??
Ql_UART_IoCtl(fd, TIOCSSERIAL, &serial);
tcgetattr(iFd, &options);
/*
* 'DATA_LEN' bytes can be read by serial
*/
options.c_cc[VMIN]? ?=? ?4096;
options.c_cc[VTIME]? =? ?10;
tcflush(fd, TCIFLUSH);
if (tcsetattr(iFd,? ?TCSANOW,? ?&options)<0)
return? ?-1;
#endif
return fd;
}
將黃色的內容屏蔽掉后測試恢復正常,黃色的內容是我本來要加大串口的發送和接收的buf緩存以增大每次接收和發送的字節buff ,但經過實際測試,根本沒
有個鳥用,所以還是將這段內容屏蔽掉。
總結
以上是生活随笔為你收集整理的linux关机重启机器人,Linux Stopped (tty output) 问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Vue][面试]你怎么理解vue中的d
- 下一篇: 【JavaEE进阶系列 | 从小白到工程