客户在开发时,经常需要英创工控主板和其他的一些设备通过串口进行通讯,针对不同的设备,连接的方法也有所不同,下面就来介绍一下具体的方法。
在工业控制领域中,常使用的RS232通讯串口分为三线制和五线制,三线制的串口顾名思义,使用了三根线通讯,分别为RX(接收),TX(输出),GND。而五线制的串口就是常说的使用了RTS/CTS流控的串口,在三线制串口的基础上加入了流控信号,所以它的信号分别为RX,TX,RTS,CTS,GND。英创工控主板和设备连接原理如下图:
当设备使用的串口为三线制串口时,可以直接英创评估底板引出的串口连接,使用英创公司提供的测试例程就能正常通讯。当设备使用的是五线制串口时,因为英创工控主板中大部分都是三线制的串口,所以如果使用三线制的串口直接与设备连接进行通讯,设备的收不到流控的信号,就不能够正常的收发数据。针对这种情况,英创公司给出了两种解决的方案。
第一种方案
第一种方法是使用英创工控主板的COM2(ttyS1)口进行通讯,因为英创工控主板的COM2口是完整的九线制的串口,这一路串口自带RTS/CTS流控信号,能够直接与设备正常通信,只需要在程序中单独控制RTS信号,将RTS信号置为有效,这样就能满足设备的通讯要求,正常进行数据的收发。但是COM2口使用的是TTL电平,所以如果需要与RS232电平的串口进行通讯,还需要一个扩展电路来实现电平转换,这里英创公司给出一种扩展电路的方案,如下图:
从图中可以看出,因为英创工控主板的的TTL电平输入输出为3.3V,所以COM2口的信号先由3.3V和5V之间相互转换,再从TTL电平转换为RS232电平。
在软件控制方面,根据上面所讲的,需要控制英创工控主板的RTS信号,将信号置为有效,调用ioctl()函数即可以达到目的:
i=ioctl(m_fd, TIOCMGET, &status);
if(i<0)
{
printf('wrong!!\n');
}
printf('i-%d\n',i);
status |= TIOCM_RTS; // 将RTS信号置为有效
ioctl(m_fd, TIOCMSET, &status);
第二种方案
第二种方案是针对普通三线制串口的,因为英创工控主板上大部分都是三线制串口,如果使用三线制串口,也是可以和使用五线制串口的设备通讯的,只是需要做一些处理。五线制串口不能和三线制串口通讯的原因是因为收不到对方发送来的RTS#信号,所以我们可以选用一路GPIO来作为RTS#信号,RTS#信号是低有效的,在通信的过程中,让GPIO输出低电平,这样对于设备来说,就能收到英创主板发送来的RTS#信号,通讯就能够正常进行了。和第一种方案相同,还是需要一个扩展电路来实现功能,下面英创公司给出一种扩展电路的方案,如图:
如图所示,将一路GPIO作为RTS#信号,这样使用三线制的串口就能和设备进行正常的通讯了。
在通讯的过程中,需要控制GPIO,使能GPIO输出低电平即可:
fd = open( '/dev/em9280_gpio', O_RDWR );
if( fd < 0 )
{
printf( 'Can not open /dev/em9280_gpio, fd=%d\n', fd );
return -1;
}
GPIO_OutEnable( fd, GPIO1);
GPIO_OutClear(fd, GPIO1); // 等效使RTS有效
最后设置好设备要求的波特率,停止位等配置参数,就能够正常的与使用RTS/CTS流控的设备进行通讯了。
全部0条评论
快来发表一下你的评论吧 !