Download your favorite Linux distribution at LQ ISO.
Go Back > Forums > Linux Forums > Linux - Hardware
User Name
Linux - Hardware This forum is for Hardware issues.
Having trouble installing a piece of hardware? Want to know if that peripheral is compatible with Linux?


  Search this Thread
Old 05-12-2010, 02:46 AM   #1
LQ Newbie
Registered: Feb 2010
Posts: 3

Rep: Reputation: 0
Serial port UART FIFO buffer override

I install multiport serial card with WCH CH352L chipset, it has driver for Linux:
# dmesg|grep ttyS
[ 1.313772] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 1.313944] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[ 1.314574] 00:08: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 1.314866] 00:09: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[ 1.315268] 0000:00:07.0: ttyS2 at I/O 0xdf00 (irq = 18) is a XScale
[ 1.315502] 0000:00:07.0: ttyS3 at I/O 0xe000 (irq = 18) is a XScale

# setserial -g /dev/ttyS*
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: 16550A, Port: 0xdf00, IRQ: 18 - multiport card
/dev/ttyS3, UART: 16550A, Port: 0xe000, IRQ: 18 - multiport card

It read nice. When try to transfer less then 17 byte it looks ok(ttyS1 and ttyS3 connected with null-modem cable):
# echo "1234567890123456" > /dev/ttyS3
# cat /dev/ttyS1

But when more then 16 byte:
#echo "12345678901234567890" > /dev/ttyS3
# cat /dev/ttyS1

#echo "12345678901234567890abcdef" > /dev/ttyS3
# cat /dev/ttyS1

16550A Uart FIFO has 16 byte buffer and it looks like how bytes in fifo buffer rewrite from begin because uart don't have time to send it out.

Can any help me? why it don't work fine?
Old 05-13-2010, 12:30 AM   #2
Registered: Apr 2010
Posts: 82

Rep: Reputation: 23
I kind of half remember doing this a long long time ago
The internal circular buffer of the UART gets overwritten by the new data.
You should turn on flow control on the receiving UART (if supported, should be!) using setserial with the flow_on parameter.
This will get the receiving UART to tell the sending UART to stop sending bytes if the receiving buffer is almost full and tell it to start sending again if the buffer is read and thus emptied.
If your null modem cable has the RTS and CTS lines cross wired you can go for hardware flow control, otherwise use soft control.

For the receiving side you need a receiving process that reads out the bytes that get put into the receiving buffer.
The 'solution' I came up with, having to use bash of course was something like:
- use the mkfifo command to create a local fifo file: mkfifo /tmp/myff
- run a background process to continiously read from serial and dump to fifo: tail /dev/ttyS1 -f > /tmp/myff &
- echo "1234567890123456" > /dev/ttyS3
- Wait a micro second or two...
- cat /tmp/myff
Not sure if I remembered it all correctly, but you might give it a go!
Old 05-13-2010, 12:47 AM   #3
LQ Newbie
Registered: Feb 2010
Posts: 3

Original Poster
Rep: Reputation: 0
Thanks to kurwongbah for answer, I will try this.

But I thought that it happend because interrupt dont have time to send bytes from fifo tx buffer, and it rewrites bytes in TX fifo buffer, and then send error bytes to other serial in rx buffer.
TX Trigger level must be 14 bytes by default(for 16550) and I can't change it with setserial, and looks like that Uart dont generate interrupt when receive 14 bytes from 8k serial buffer.
Myabe I wrong, thanks for answer, will tell you result.


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
expecting Serial port output to a buffer nathan Programming 5 09-22-2009 03:29 PM
serial port not filling buffer entirely windell Programming 1 08-05-2008 10:12 AM
Query buffer with serial port /dev/ttyS0 mmcshmi11 Linux - Hardware 2 07-08-2008 04:24 PM
Serial Port Buffer Overrun damiendusha Linux - Hardware 1 06-22-2006 02:56 AM
Uart serial port + SysRq flook Linux - Hardware 0 11-30-2004 08:57 AM > Forums > Linux Forums > Linux - Hardware

All times are GMT -5. The time now is 11:23 PM.

Main Menu
Write for LQ is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration