Hi,
I'm hoping someone out there has some thoughts or suggestions that can
help me with a problem I'm having. I'm using a TS7260 connected to 2
multi port switching valves on com1 and com3. I'm using RS232 code that
I've been using for a while and until now was fairly confident worked
well. However what I'm seeing in this case is that if I query the valves
and they don't actually perform any processing they respond pretty fast,
~1-2ms, and when I attempt to read the com port there is nothing in the
serial buffer. If on the other hand the valves have to do some
processing, for instance changing position, the response will be closer
to 20ms and then I receive the data as expected.
I know that the response is sent in both cases as I can put a serial
sniffer in between the TS7260 and valves and see the response/times as
seen by the sniffer. This happens on both com1 and com3, so it's not
tied to a specific com. Since it's RS232 I'm thinking response time
shouldn't make a difference, assuming the kernel serial driver detects
the response and buffers it appropriately, but maybe this is naive
thinking.
Below are some snippets of code that I use for opening/configuring the
ports. One of the things I need to change to see if it makes a
difference here is the INPCK parameter. I've always set this in the
past, but maybe it is problematic? Due to some unforeseen/unrelated
problems I haven't been able to check this and probably won't be able to
for a couple days. Instead I'm posting here.
Normally when reading I use ioctl(...) to check for data before reading
to insure that the response has completed, but I've tried both using
ioctl(...) and calling read(...) directly with the same results.
The valves themselves are TTL devices connected to a 232-ttl converter.
I'm pretty certain that this is at least working to some degree as
transmit from the TS7260 to the valves works fine, and responses are
fine if the valves response is slower. Also, responses from the valves
are seen on the serial sniffer in both cases. Unfortunately I don't
think I have the ability to change the valves behavior.
I've got a scope that I can hook up and analyze the responses in each
case, but unfortunately I'm stuck for the time being waiting on parts.
In the meantime I thought I'd check here since I'm a bit perplexed at
how to proceed.
//////////////////////////////////////
if(m_Port==3)
sprintf(serialdevice,"/dev/ttyTS0");
else
sprintf(serialdevice,"/dev/ttyAM%d",m_Port-1);
m_CommDev = open(serialdevice, O_RDWR | O_NOCTTY | O_NONBLOCK);
m_Open = (m_CommDev==-1) ? false : true;
...
if(m_Open)
{
tcgetattr(m_CommDev,&m_OldTermIO); // save
current port settings
bzero(&m_NewTermIO, sizeof(m_NewTermIO)); // clear
new port settings
m_NewTermIO.c_cflag |= (CREAD | CLOCAL);
m_NewTermIO.c_cflag |= CS8;
m_NewTermIO.c_iflag |= INPCK;
switch(m_BaudRate)
{
case 9600:
cfsetispeed(&m_NewTermIO,B9600);
cfsetospeed(&m_NewTermIO,B9600);
break;
case 19200:
cfsetispeed(&m_NewTermIO,B19200);
cfsetospeed(&m_NewTermIO,B19200);
break;
case 38400:
cfsetispeed(&m_NewTermIO,B38400);
cfsetospeed(&m_NewTermIO,B38400);
break;
case 57600:
cfsetispeed(&m_NewTermIO,B57600);
cfsetospeed(&m_NewTermIO,B57600);
break;
case 115200:
cfsetispeed(&m_NewTermIO,B115200);
cfsetospeed(&m_NewTermIO,B115200);
break;
}
tcflush(m_CommDev, TCIFLUSH);
tcsetattr(m_CommDev,TCSANOW,&m_NewTermIO);
}
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/ts-7000/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/ts-7000/join
(Yahoo! ID required)
<*> To change settings via email:
<*> To unsubscribe from this group, send an email to:
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|