직렬 포트에서 동시에 쓰기와 읽기를 시도하고 있습니다. 그 목적은 직렬 포트에 연결된 DIO 카드를 통해 장치를 켜고 끄는 것입니다. 이러한 켜기/끄기 테스트를 수행하는 동안 DIO 카드에도 연결된 광 센서에서 일부 데이터를 수집해야 합니다.
일반적으로 처음 몇 분/시간 동안은 모든 것이 예상대로 진행됩니다. DIO 카드에 명령을 보내고 실행하는 동시에 광 센서 데이터를 읽을 수 있습니다. 불행하게도 몇 분/시간 후에는 작동이 중지되고 포트를 통해 어떤 명령도 전혀 보낼 수 없습니다.
직렬 포트 설정:
다음 직렬 포트 설정을 사용합니다.sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -echo
터미널에서 명령을 보내려고 하면 다음과 같은 오류 메시지가 나타납니다.bash: /dev/ttyUSB0: Permission denied
직렬 포트 설정을 읽으려고 하면 stty < /dev/ttyUSB0 command
다음 오류 메시지가 나타납니다 stty: standard input: Inappropriate ioctl for device
.
또한 이 오류가 발생하면 직렬 포트 설정이 변경되는 것으로 나타났습니다. 터미널에 다음 명령을 입력했을 때 이 사실을 발견했습니다.ls -la /dev/ttyUSB0
모든 것이 제대로 작동하면 다음과 같은 결과가 나타납니다.
crw-rw---- 1 root dialout 188, 0 Nov 8 11:12 /dev/ttyUSB0
오류가 발생한 후 다음과 같은 결과가 나타납니다(정확한 출력을 저장하는 것을 잊어버렸습니다).
rw-rw-rw- 1 root root 8, 0 Nov 8 11:12 /dev/ttyUSB0
파일 설명자가 누락되어 그 이후에는 명령을 보낼 수 없는 이유일 것입니다...
내가 지금까지 시도한 것 :
지금까지는 직렬 포트 설정만 변경해 보았습니다. 기본적으로 직렬 포트에서 쓰고 읽을 수 있는 프로그램의 설정을 복사했습니다. 불행히도 문제는 여전히 존재합니다.
저도 관련 문제로 알고 있습니다.
에코 테스트 | stty -echo -> stty: stdin: 장치의 ioctl이 부적절합니다.
bash 스크립트 오류 stty: stdin: 장치에 부적절한 ioctl
이 게시물 덕분에 문제가 stty 명령의 -echo 연산자와 관련이 있다는 결론에 도달했습니다. 현재 이 연산자 없이 테스트를 실행하고 있으며 작동하는 것 같습니다. 지금 말하기에는 너무 이르지만 아침. 그러나 이 연산자가 없으면 -echo
광 센서에서 수집된 데이터가 올바르게 표시되지 않습니다. 연산자를 사용하여 작동하게 하고 싶지만 방법을 모르겠습니다.
-echo
그래서 내 질문은 운영자와 함께 작동 하도록 할 수 있는 방법이 있습니까 ?
이러한 스크립트의 논리는 아래에 설명되어 있습니다.
- Main_Script.sh
- Light_Sensors.sh
- 테스트 시나리오.sh
1) 메인_스크립트.sh
#!/bin/bash
sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -echo
gnome-terminal -e ./Light_Sensor.sh
for ((countOuter=1;countOuter<=$testRunsOuter;countOuter++))
do
for ((countInner=1;countInner<=$testRunsInner;countInner++))
do
./Test_Scenario.sh
done
done
2)Light_Sensor.sh
#!/bin/bash
while read -r line < /dev/ttyUSB0; do
timestamp=$(date +%T.%3N)
echo "$timestamp || $line" | sed -E 's/(DO[0-9]=[0-9];|ADC5.+ADC8=[0-9]*mV;)//g' >> $devicesFolder/lightSensor_log.txt
echo $line
idOfMainScript=$(ps -aux | grep -E "\/bin\/bash.+Main_Script\.sh")
if [[ -z $idOfMainScript ]]; then
break
fi
done
printf "adc-loop;" > /dev/ttyUSB0
3) 테스트_시나리오.sh
#!/bin/bash
printf "DO1=1;" > /dev/ttyUSB0
sleep 50
printf "DO1=0;" > /dev/ttyUSB0
답변1
실수로 문자 장치 /dev/ttyUSB0을 덮어써서 기본적으로 일반 파일로 만들 수 있습니다. 실패한 후 확인 file /dev/ttyUSB0
하고 그것이 무엇인지 확인하십시오. 또한 그룹이 다이얼아웃에서 루트로 변경되는 경우에도 마찬가지인 것 같습니다.