gpt4 book ai didi

linux - 串行数据损坏

转载 作者:太空宇宙 更新时间:2023-11-04 10:20:00 25 4
gpt4 key购买 nike

我有一个问题。我有 2 个硬件(类似于 pi),我正在尝试测试它们之间通过串行电缆进行的通信。两者都是基于 Linux 的,但工具有限。我写了一个脚本来发送和接收文件。当我发送一个包含一些文本的 txt 文件时,一切正常。当我尝试发送一个二进制文件时,它的数据不一样,有时我得到更大的文件,有时更小,有时只是一些字节被改变。我想了好几个小时为什么会这样,我将设备设置为 raw 模式(对于二进制文件)...

这是我写的脚本:

#!/bin/bash

FILE=$2

send()
{
if [ ! -f $FILE ]; then
echo "File $2 doesn not exist, please introduce a valid file"
fi
content=`cat "$FILE"` #Dump the file content into variable
echo -E "$content" > /dev/ttyO5 #send the whole content to the other device



}
receive()
{

if [ -f $FILE ]; then
echo "The file already exists. Do you want to overwrite it? (y/n
read opc
if [ "$opc" == "n" ]; then
exit 1
fi
rm "$FILE"
fi

while read -t 5 -r -n 1 c; do # read char by char -r to avoid backslashes to be scaped
echo -E -n "$c" >> $FILE # append char on file -n(to avoid creation of new lines and -E to avoid interpretation of backslashes.

done < /dev/ttyO5

}
case $1 in

's')
send
;;
'r')
receive
;;
*)
echo "Usage $0 [s | r] [FILE]"
;;

esac

要将设备置于 raw 模式,我使用 stty -F/dev/ttyO5 raw 这是设备的选项:

speed 9600 baud;stty: /dev/ttyO5
line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon
-ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0
ff0
-isig -icanon iexten -echo -echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

我的想法告诉我,在解释某些字符时存在问题,并且可能会通过更改上面的某些选项来解决。我尝试了几个,但我无法让它发挥作用。如果有人看到我没有看到的东西,我将不胜感激。

问候

编辑:发现问题但未解决。 Read 和 cat 不喜欢字符 NULL\n。我如何读取这 2 个字符?

最佳答案

在读取前添加IFS=,允许读取空格、制表符

 while IFS= read -t 5 -r -n 1 c; do

编辑:'\n' 和 '\0' 仍然无法读取。

比较以下两个输出

for i in {{0..9},a,b,c,d,e,f}{{0..9},a,b,c,d,e,f};do printf '\x'"$i"; done | od -c

for i in {{0..9},a,b,c,d,e,f}{{0..9},a,b,c,d,e,f};do printf '\x'"$i"; done | { while IFS= read -r -n1 c; do echo -E -n "$c";done;} | od -c

编辑:要读取换行符,请添加选项 -d ''

 while IFS= read -t 5 -r -n 1 -d '' c; do

如果 [[ $c = '' ]];所以在这种情况下它是 '\0' 字符,例如使用 printf '\0' 来写它

以下命令证明可以复制所有字符

for i in {{0..9},a,b,c,d,e,f}{{0..9},a,b,c,d,e,f};do printf '\x'"$i"; done | { while IFS= read -r -n1 -d '' c; do if [[ $c = '' ]]; then printf '\0'; else echo -E -n "$c";fi;done;} | od -c

编辑:考虑到性能 read 很慢,考虑使用另一个 unix 工具:perl

perl -e '
# $/ end of line of input, special variable
# read one byte at time
$/=\1;

my $outfilename=shift;
open $outfile,">>",$outfilename or die $!;

while (<>) {
# do something on output (for example print ascii number)
print ord($_),"\n";

# write to out file
print $outfile "$_";
}
' "$FILE" < /dev/ttyO5

关于linux - 串行数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44304933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com