2017-05-28 94 views
0

我有一个串行设备(病态LMS200)使用RS422转USB转换器连接到我的电脑。 LMS200和我的PC上的串口设置(波特率,停止位等)匹配并正在通信(使用LMS200附带的应用程序进行验证)。我需要编写一个与LMS通信的自定义应用程序。如何构建一个串行(RS422或RS232)消息通过PuTTy与病态LMS200进行通信?

在开始构建我的应用程序之前,我需要弄清楚如何在PC和LMS之间交换数据报。为了解决这个问题,我一直在尝试使用PuTTy手动发送数据报。 LMS手册(https://drive.google.com/open?id=0Byv4owwJZnRYVUJPMXdud0Z6Uzg)定义了数据报类型以及它们应该如何构建。例如,在手册的第46页,可以看到一个发送特定指令给单元的数据报;它看起来像这样:02 00 02 00 30 01 31 18

但是,当我使用PuTTy发送字符串02 00 02 00 30 01 31 18 LMS不响应(它应该)。我相信它没有响应,因为数据报丢失了一些串行头数据,或者我没有正确表示十六进制值(我试图用0x0000h代表字节,如00,但没有成功)。你能帮我用手册制定一个有效的串行消息吗?我一直在这里待了很长时间,而且我很难理解如何将手册中的信息转换为有效的数据报。

如果我可以提供更多信息,请让我知道。提前致谢。

+0

没有像串行通信的帧或数据包的东西。你可以拥有像终端标准的东西,例如VT-100或专有协议。 –

+0

好的,这是一个专有协议,VT-100是一个专有协议。你没有发送字符串“02 00 02 ...”吗?您应该发送字节值02十六进制然后00十六进制等,即每个数字对的单个字节/字符。这可能是与腻子有关的挑战,不知道如何让它发送00(nul)。您可以尝试窥探应用程序与设备之间的通信 - 这样,您可以计算出您的数据包需要哪些额外信息才能被设备接受。 – barny

+0

@ barny不幸的是,我发送的是字符串。如何区分02十进制和02十六进制? '0x02'和'02h'都不起作用。我应该将02表示为'00000010'吗?任何其他想法? – Mike

回答

1

我没有正确表示十六进制值(我试图用0x00和00h表示字节,例如00,但没有成功)。

Ctrl上终端/ PC键盘键可用于产生ASCII控制字符(即通过0x1F不可打印字符的0x00字节值)。
就像Shift键生成密钥的移位或大写字符(而不是其未移位或小写字符),Ctrl键(带有字母或其他几个键)可以生成ASCII控制字符。

典型美国PC键盘可以生成一个ASCII“NUL”字符通过键入CTRL- @,即,通过按住CTRLShift键和键入2(因为“@”字符是移位字符美国PC键盘上的2键)。

以类似的方式为 'SOH' 或0x01类型CTRL-A(即CTRL + A键时,Shift是不必要的),关于 'STX' 或0x02类型CTRL-B,等等
对于'SUB'或0x1A键入ctrl-Z。
对于'ESC'或0x1B键入Esc键。
对于'FS'或0x1C类型ctrl- \(或CTRL + \)。
对于'GS'或0x1D类型ctrl-](或CTRL + ])。
对于'RS'或0x1E类型ctrl- ^(或CTRL + Shift + 6)。
对于'US'或0x1F类型ctrl-_(或CTRL + Shift + -)。请注意,一些经常使用的ASCII控制代码具有专用密钥,例如,
'HT' 具有Tab0x09
'BS' 具有Backspace0x08
'LF' 具有用于0x0AEnter键(在Linux中),并
'ESC' 具有Esc键为0x1B


当你不知道如何从键盘的ASCII控制字符,你可以退而使用十六进制编辑器(不是一个文本编辑器)在文件中创建消息,然后发送文件。

实际上,二进制文件可能是手工生成二进制消息最可靠的方法。当代码被shell或应用程序拦截为特殊指令(例如ctrl-C或ctrl-Z放弃程序)而不是将其视为数据时,控制代码的手写输入可能会失败。
转义输入数据是一种避免这种情况的方法。
电话调制解调器在透明(又名数据)模式下通过需要时间保护(即特定的空闲时间)来分隔和区分命令与数据,可以避免此问题。

1

完成这件事的方式是:

(1)下载hexedit的软件,并创建包含十六进制值(ASCII表中没有小数reprsentations - 其中2号正在tramitted 32)的文件(2)使用Tera Term软件通过串行线路发送文件。

相关问题