串口通讯问题,大牛请进

桃子先生 2015-05-28 09:56:25
是这样的,公司老总让我做一个串口通讯的程序,但是给的示例是用VB写的,而我是搞c#的,所以我按我的理解去写这个示例,完全没有反应,接不到返回的值,VB的示例代码如下:
'TS0 <ESC T> FM0
OPEN "COM1:E81N" AS #1
OPEN "TS0ASC.DAT" FOR OUTPUT AS #2
PRINT #1,"TS0"
LINE INPUT #1,D$:PRINT D$
PRINT #1,CHR$(&H1B)+"T"
LINE INPUT #1,D$:PRINT D$
PRINT #1,"FM0,001,010"
LINE INPUT #1,D$:PRINT D$:PRINT #2,D$
IF MID$(D$,2,1)<>"E" THEN 90
CLOSE
END

,能不能请大牛按这个示例给我解释一下,到底向#1这个串口中输入了什么? 我现在向这个串口中输入 TS0 <ESC T> FM0,1,2 是没有任何反应的。
...全文
568 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
桃子先生 2015-05-29
  • 打赏
  • 举报
回复
感谢以上所有回复的朋友,特别感谢@Tiger_Zhao 和@Chen8013 两位大牛,我昨天5点下班了,所以没有及时的回复,刚到单位,我试一下两位大牛的说话,再次感谢 。
桃子先生 2015-05-29
  • 打赏
  • 举报
回复
感谢@舉杯邀明月 和@Tiger_Zhao 的回复,问题成功解决,问题确实是出在ESC的ASCII码的转码问题上,此贴终结。
Tiger_Zhao 2015-05-28
  • 打赏
  • 举报
回复
TS0\r\n
文件中读入的第一行\r\n
\x1BT\r\n
文件中读入的第二行\r\n
FM0,001,010\r\n
文件中读入的第三行\r\n

还有下面这句语句不通,如果是GOTO的话还存在循环,输出不止这些。
IF MID$(D$,2,1)<>"E" THEN 90

line_us 2015-05-28
  • 打赏
  • 举报
回复
顺便看看有兴趣的主题。
largeskymengsk 2015-05-28
  • 打赏
  • 举报
回复
bushound 抓捕硬件传输数据的利器。
舉杯邀明月 2015-05-28
  • 打赏
  • 举报
回复
还有一个问题是,你“向串口输出”指令后,应该要等待串口回应数据。 并且,串口有回应后,你读取它的数据之后,确认你的代码会使它的“缓冲区”能清空(或者你自己用语句把它清空)。
舉杯邀明月 2015-05-28
  • 打赏
  • 举报
回复
PRINT #1,CHR$(&H1B)+"T" 对应的字节流,应该是这4个字节: 1B 54 0D 0A
舉杯邀明月 2015-05-28
  • 打赏
  • 举报
回复
引用 18 楼 qin7wy5lp 的回复:
[quote=引用 17 楼 Chen8013 的回复:] 还有,它的打开串口的语句:OPEN "COM1:E81N" AS #1 我没明白它的 "COM1:E81N" 中 E81N 是什么意思。 串口通讯方面,我没有接触过。 你要确认你的串口操作中,流模式、波特率等方面的参数,必须要符合它的标准。
模式和波特率这方面是没问题的,现在的问题应该就出在通讯数据格式上,按你的说话,TS0转成字节流应该是3个字节,而回车\r\n各占了2个字节,是吗? 这点我明白,而我不明白的是,27对应的ACSII码是ESC,也就是3个节字,你的意思是让我发送字符串ESCT吗? 这个ESC和T之间有没有空格之类的? [/quote] ASCII码27的字符是"ESC",这个ESC是控制符名称的简称,全称还应该是 escape 呢! 它只是一个字符,就是编码是0x1B 的。怎么成“3个字符(字节)”了! 你怎么不说是6个字符……
Tiger_Zhao 2015-05-28
  • 打赏
  • 举报
回复
ESC 是对字符 '\x1B' 的称呼,就像回车 '\x0D' 称呼为 CR、换行 '\x0A' 称呼为 LF 一样。
我们说传“回车换行”你总不会传字符串 "CRLF" 吧。
PRINT #1,CHR$(&H1B)+"T"

这个传送的字节流就是 1B-54-0D-0A
桃子先生 2015-05-28
  • 打赏
  • 举报
回复
引用 16 楼 Chen8013 的回复:
ASCII码是27的控制字符,如果它作为“字符”来显示,显示成←也应该正常。
你说“没有返回值”,我也不知道你向串口输入的“指令”是否正确,特别是编码格式是否正确。
比如BASIC语句:PRINT #1,"TS0"
实际应该向串口写入了5个字节。字节流应该是(16进制):
54 53 30 0D 0A
你确认你的C#代码,是这样的内容吗…………

我确认了一下,TS0\r\n的字节数组是没问题的,现在我怀疑的是在ESCT这个环节出的问题。
下面是TS0\r\n的字节数组截图。
桃子先生 2015-05-28
  • 打赏
  • 举报
回复
引用 17 楼 Chen8013 的回复:
还有,它的打开串口的语句:OPEN "COM1:E81N" AS #1 我没明白它的 "COM1:E81N" 中 E81N 是什么意思。 串口通讯方面,我没有接触过。 你要确认你的串口操作中,流模式、波特率等方面的参数,必须要符合它的标准。
模式和波特率这方面是没问题的,现在的问题应该就出在通讯数据格式上,按你的说话,TS0转成字节流应该是3个字节,而回车\r\n各占了2个字节,是吗? 这点我明白,而我不明白的是,27对应的ACSII码是ESC,也就是3个节字,你的意思是让我发送字符串ESCT吗? 这个ESC和T之间有没有空格之类的?
舉杯邀明月 2015-05-28
  • 打赏
  • 举报
回复
还有,它的打开串口的语句:OPEN "COM1:E81N" AS #1 我没明白它的 "COM1:E81N" 中 E81N 是什么意思。 串口通讯方面,我没有接触过。 你要确认你的串口操作中,流模式、波特率等方面的参数,必须要符合它的标准。
舉杯邀明月 2015-05-28
  • 打赏
  • 举报
回复
ASCII码是27的控制字符,如果它作为“字符”来显示,显示成←也应该正常。 你说“没有返回值”,我也不知道你向串口输入的“指令”是否正确,特别是编码格式是否正确。 比如BASIC语句:PRINT #1,"TS0" 实际应该向串口写入了5个字节。字节流应该是(16进制): 54 53 30 0D 0A 你确认你的C#代码,是这样的内容吗…………
桃子先生 2015-05-28
  • 打赏
  • 举报
回复
@Tiger_Zhao @Chen8013 两位大牛,还在吗?能不能再帮忙看看。
桃子先生 2015-05-28
  • 打赏
  • 举报
回复
引用 13 楼 Chen8013 的回复:
[quote=引用 3 楼 qin7wy5lp 的回复:]
1234

[quote=引用 1 楼 Tiger_Zhao 的回复:]
TS0\r\n
文件中读入的第一行\r\n
\x1BT\r\n
文件中读入的第二行\r\n
FM0,001,010\r\n
文件中读入的第三行\r\n

还有下面这句语句不通,如果是GOTO的话还存在循环,输出不止这些。
IF MID$(D$,2,1)<>"E" THEN 90

是这样的,这个示例是一个串口通讯示例,我不关心读文件的操作,只想知道向#1里输入了什么。。 如果按你说的,是不是第一次向#1里发送了 TS0, 然后第二次发送了1BT ,然后第三次发送了FM0,001,010? 还是说只是往#1这个流里输入 TS0 1BT FM0,001,010 然后一次性发送过去的?[/quote]
不是一次性向串口输入(应为“输出”)的,是分多次进行输入/输出。
还有你这儿说的1BT,实际不是 "1BT",是两个字符,第一个是ASCII码27的控制字符,第二个是字符T。
还有,PRINT #1 每次向串口输出数据,它应该是会在字符串后加上了“回车+换行”这两个控制字符的(自动加的)。
[/quote]

是这样的,我把27转成ascii码+T进行输出了,也就是第二行的内容,但是转出来是个←.. 不知道我理解的有误吗?
现在的问题是,还是没有返回值.. 我是不是可以理解,TS0,这是3个字符, 然后输入一次,(ESC)T这是2个字符,输入一次,最后 FM0,001,010 这是11个字符,对吗?
舉杯邀明月 2015-05-28
  • 打赏
  • 举报
回复
引用 3 楼 qin7wy5lp 的回复:
1234 [quote=引用 1 楼 Tiger_Zhao 的回复:]
TS0\r\n
文件中读入的第一行\r\n
\x1BT\r\n
文件中读入的第二行\r\n
FM0,001,010\r\n
文件中读入的第三行\r\n
还有下面这句语句不通,如果是GOTO的话还存在循环,输出不止这些。
IF MID$(D$,2,1)<>"E" THEN 90
是这样的,这个示例是一个串口通讯示例,我不关心读文件的操作,只想知道向#1里输入了什么。。 如果按你说的,是不是第一次向#1里发送了 TS0, 然后第二次发送了1BT ,然后第三次发送了FM0,001,010? 还是说只是往#1这个流里输入 TS0 1BT FM0,001,010 然后一次性发送过去的?[/quote] 不是一次性向串口输入(应为“输出”)的,是分多次进行输入/输出。 还有你这儿说的1BT,实际不是 "1BT",是两个字符,第一个是ASCII码27的控制字符,第二个是字符T。 还有,PRINT #1 每次向串口输出数据,它应该是会在字符串后加上了“回车+换行”这两个控制字符的(自动加的)。
Tiger_Zhao 2015-05-28
  • 打赏
  • 举报
回复
还是 Chen8013 看的仔细,读写都在 #1 上,我脑补成读文件输出串口了

那么前面#9说的可以合并输出错误。
必须是输出/输入交叉进行,并且一次输入必须以收到换行为结束。
桃子先生 2015-05-28
  • 打赏
  • 举报
回复
谢谢chen8013 和trger_zhao的帮助,我去试一下,真心感谢。
舉杯邀明月 2015-05-28
  • 打赏
  • 举报
回复
参考一下吧:
OPEN "COM1:E81N" AS #1                 ' 打开串口 COM1(没指明模式,应该是可以 I/O)
OPEN "TS0ASC.DAT" FOR OUTPUT AS #2     ' 打开磁盘文件 TS0ASC.DAT(仅用于“输出”)
PRINT #1,"TS0"                         ' 向COM1输出字符串 "TS0"
LINE INPUT #1,D$:PRINT D$              ' 从COM1读取数据:  内容输出到屏幕上
PRINT #1,CHR$(&H1B)+"T"                ' 向COM1输出字符串 CHR$(&H1B)+"T"
'                                      ' Chr$(&H1B) 就是ACCII码为27的控制字符
LINE INPUT #1,D$:PRINT D$              ' 从COM1读取数据:  内容输出到屏幕上
PRINT #1,"FM0,001,010"                 ' 向COM1输出字符串 "FM0,001,010"
LINE INPUT #1,D$:PRINT D$:PRINT #2,D$  ' 从COM1读取数据:  内容输出到屏幕和文件中
IF MID$(D$,2,1)<>"E" THEN 90           ' 如果刚才读取的数据第2个字符是E,跳转到行号为90处
CLOSE              ' 关闭所有(本程序打开的全部串口和磁盘文件)
END                ' 结束程序
这个代码段没有行标号“90”,不知道它那个跳转跳到哪去了。
Tiger_Zhao 2015-05-28
  • 打赏
  • 举报
回复
串口无所谓写几次,只要保证整个流的次序正确就行。
你要一次发也没关系,不过无论接收还是发送端都是有缓冲区的,注意是否会溢出。
还有 \n\r 不能少,接收端很可能用换行作为分割的,少了就不能正常解析了。

BASIC 还是 VB 无所谓,反正你要转 C#,只要知道数据格式就行。
加载更多回复(7)

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧