}

RS232

打印 被阅读次数

这可能是最简单的通信规程,但是应用中也可能遇到问题。我琢磨了一下如何说清楚。

1. Linux termios.h

Linux PC多有RTS / CTS流控制的硬件驱动,DTR / DSR流控制要自己编码,通过IOCTL。DTR / DSR流可简化为单向即DTR控制。另一种控制是XON-XOF软件流控制。

RTS / CTS:DTE设备端的RTS=1/0=请求发给我/不要发给我;CTS是另一端的类似请求。两端都是DTE即无modem的通信时,每端的RTS接去另一端CTS来满足通信要求。DTR / DSR流量控制,DTR信号就像从RTS引脚发送的信号,而DSR引脚就像CTS引脚。

下面贴图是最常见的Null-modem电缆和9-25脚适配器内联线。只用DTR时是单向流量控制。为了解决Linux不支持DTR/DSR的问题,可将终端子DTR与CTS相连后去计算机的DSR,还可将终端的DSR接计算机上的RTS引脚。

RTS的原始用法和命名用在Null-modem下很易误解。DTE(终端或计算机)和DCE(调制解调器)的RTS/CTS是同名相连,调制解调器通过RTS接受对方的请求发送,发送CTS以回应。Monitor:

https://www.virtual-serial-port.org/articles/serial-port-monitor-linux/  

https://www.amazon.com/gp/product/B08CDQ76Q8/ref=ppx_yo_dt_b_asin_title_o00_s00  

Posix guide:https://www.cmrr.umn.edu/~strupp/serial.html#2_4

OnlineGDB编译器:https://www.onlinegdb.com/ 

2. HP电源用的DTR / DSR协议
电源置DTR为1表示可接受,置0时计算机再发送的数据不得超过10个字符。要禁用DTR / DSR握手,电源端DTR不接并置DSR为1;且应降低波特率。在以下情况下,电源会将DTR线设置为FALSE:
2.1 电源的输入缓冲区已满时(大约100字符)。当缓冲区有空时会复原,除非下面的情况阻止了它;
2.2 当电源收到了消息终止符准备处理该消息时,例如处理查询命令。电源在发送期间会置DTR为0,在发送每个字T符之前监测DSR线,其为1时才发送。如果DSR为0且电源的DTR也为0,将造成死锁,除非PC端将电源DSR置1。在PC端将电源DSR清0的情况下,解除死锁的方法是在PC端发送ctrl-c,这将中止进程并丢弃未发出的数据(等效于IEEE-488设备的clear)。

3. 实践

s/w monitor: https://download.cnet.com/IO-Ninja/3001-2085_4-10872608.html 

h/w monitor: https://www.amazon.com/gp/product/B08CDQ76Q8

此类电源用USB-232电缆接PC有许多问题,包括同牌产品有的工作有的不行。

通过Null-Modem电缆看:电源端接上后其端DSR/DCD一直为1,运行Linux自编程序,通讯期间DTR/RTS为1,RX/TX闪烁。静态时PC端则DSR/DCD/CTS一直为1。如果不用交叉电缆,静态时电源端是DTR/DCD一直亮,PC端是DTR/DCD/RTS一直亮。这些意味着,无论哪一端,要通讯时DTR/RTS应置1,等DSR/CTS为1才能发送。至于是DTR/DSR还是RTS/CTS规程,两端需要统一。

控制DTR/DSR:http://embeddedguruji.blogspot.com/2019/02/serial-port-programming-part-10.html PC端软件应常置于DTR为1,每次发送前查DSR,为1则发送否则等待,每个命令后等1.2秒。实践表明DSR为0后电源多半死锁,常伴有按键无用,显示失常,非断电不能恢复。

https://www.eevblog.com/forum/testgear/34401a-serial-interface-problems/  

https://www.keysight.com/main/software.jspx?ckey=2175637&id=2175637  

http://sine.ni.com/apps/utf8/niid_web_display.model_page?p_model_id=232

4. HP SCPI

*RST    *CLS   *IDN? => "HEWLETT-PACKARD,E3632A,0,1.2-5.0-1.0"
DISP:TEXT     DISPlay:TEXT:CLEar    DISPlay OFF|ON
APPLy 3.5,1.5             VOLT {|MAX|MIN|UP|DOWN|?}  CURR  {|MAX|MIN|UP|DOWN|?}
CURR:STEP 0.01        CURR UP     CURR DOWN
CURR?        VOLT?     APPLy? =>“15.00000, 4.00000”
OUTPut {OFF|ON|?}
SYSTem:BEEPer   SYSTem:VERSion? => "1995.0"
设置限压限流:
VOLT:PROT {|MIN|MAX}     #Set the OVP level.
VOLT:PROT:STAT {OFF|ON)   #Disable or enable the OVP circuit.
VOLT:PROT:CLE                     #Clear the tripped OVP circuit.

5. Lecroy power supply

T3PS33203P 2x0~32V/3A, 1.8V-2.5V-3.3V-5V/5A, 207W
T3PS43203P 2x0~32V/3A, 0~15V/1A, 0~5V/1A, 212 W

Syntax Example
return Vout ch VOUT? VOUT1?
return Iout ch IOUT?
set Out ch on/off :OUTPut[1|2|3|4][:STATe] ON|OFF :OUT1:STAT ON
Query Output ch :OUTPut[1|2|3|4][:STATe] ? :OUT2:STAT?
set ch voltage VSET: VSET1:0.75
set ch current ISET:
 
set OVP :OUTPut[1|2|3|4]:OVP
set OCP :OUTPut[1|2|3|4]:OCP
turn OVP on/off :OUTPut[1|2|3|4]:OVP:STATe
turn OVP on/off :OUTPut[1|2|3|4]:OCP:STATe
query OVP :OUTPut[1|2|3|4]:OVP?
query OCP :OUTPut[1|2|3|4]:OCP?
 
*IDN?
*RST
*CLS
:SYSTem:ERRor? read/clear last error
:SYSTem:CLEar clear errors
[*]SAV|RCL save/recall setup_mem_NRf
[:SYSTem:]REMote
[:SYSTem:]LOCal
 
:SYSTem:BAUDrate:USB|RS232[9600|19200|38400|57600|115200]

 

 

 

登录后才可评论.