Reading data from a serial port

Dear List -

I am trying to capture data from a serial port and write it to a file.

/var/www$ cat /dev/ttyS0 > scale_value.html 
cat: /dev/ttyS0: Device or resource busy 

/var/www#  cat /proc/tty/driver/serial 
serinfo:1.0 driver revision: 

0: uart:16550A port:000003F8 irq:4 tx:90 rx:270 brk:2 RTS|CTS|DTR|DSR|CD 
1: uart:16550A port:00001C90 irq:17 tx:19 rx:0 CTS|DSR|CD 
2: uart:unknown port:000003E8 irq:4 
3: uart:unknown port:000002E8 irq:3 

/var/www# cat /proc/interrupts 
           CPU0       CPU1 
  0:         42          0   IO-APIC-edge      timer 
  1:          3          0   IO-APIC-edge      i8042 
  4:         74         89   IO-APIC-edge      serial 
  6:          2          1   IO-APIC-edge      floppy 
  8:          0          1   IO-APIC-edge      rtc0 
  9:          1          2   IO-APIC-fasteoi   acpi 
 12:          5          0   IO-APIC-edge      i8042 
 16:     148679     155632   IO-APIC-fasteoi   uhci_hcd:usb1, uhci_hcd:usb4, ehci_hcd:usb7 
 17:          9          8   IO-APIC-fasteoi   uhci_hcd:usb2, uhci_hcd:usb5, i801_smbus 
 18:        131        143   IO-APIC-fasteoi   uhci_hcd:usb3, ehci_hcd:usb6, uhci_hcd:usb8 
 40:   54993721          0  HPET_MSI-edge      hpet2 
 41:          0   53507648  HPET_MSI-edge      hpet3 
 42:    1041026     920449   PCI-MSI-edge      eth0 
 43:     524549     476624   PCI-MSI-edge      ahci 
 44:         11          9   PCI-MSI-edge      mei_me 
 45:      46800      46570   PCI-MSI-edge      i915 
 46:       1488       1583   PCI-MSI-edge      snd_hda_intel 
NMI:      37245      37177   Non-maskable interrupts 
LOC:         16         12   Local timer interrupts 
SPU:          0          0   Spurious interrupts 
PMI:      37245      37177   Performance monitoring interrupts 
IWI:     258822     264271   IRQ work interrupts 
RTR:          0          0   APIC ICR read retries 
RES:    5271209    5278411   Rescheduling interrupts 
CAL:        433        693   Function call interrupts 
TLB:    2917013    2903216   TLB shootdowns 
TRM:          0          0   Thermal event interrupts 
THR:          0          0   Threshold APIC interrupts 
MCE:          0          0   Machine check exceptions 
MCP:       1061       1061   Machine check polls 
ERR:          0 
MIS:          0 

/dev/ttyS1, Line 1, UART: 16550A, Port: 0x1c90, IRQ: 17 
    Baud_base: 115200, close_delay: 50, divisor: 0 
    closing_wait: none 
    Flags: spd_normal skip_test 

/var/www#  setserial /dev/ttyS0 -a 
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4 
    Baud_base: 115200, close_delay: 50, divisor: 0 
    closing_wait: 3000 
    Flags: spd_normal skip_test 

How do I get rid of the busy message?

TIA

Ethan

Mayhap it IS busy? What be the output of lsof /dev/ttyS0 ?

The IRQ of your serial port hasn't been relevant for about 20 years.

Depending on how your serial port is configured, it may expect RTS/CTS or DTR/DSR handshaking before it will communicate(i.e. will consider the connection 'closed' when certain control lines aren't just right). You can configure this with stty. I think this turns it off.

stty -f /dev/ttyS0 -crtscts -cdtrdsr
1 Like

Thanks RudiC

lsof /dev/ttyS0
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
screen 28323 root 6u CHR 4,64 0t0 1119 /dev/ttyS0

The output is from scale which transmits via a rs232 link.

I can see the output on the screen, in ASCII characters.

That, obviously, would be what has it open.

Close that screen session.

Thanks Corona688

cat < /dev/ttyS0 > myfile
bash: /dev/ttyS0: Device or resource busy

No screen program running

Sometimes a serial transfer can be a RPITA...
There is usually a buffer of _at_least_ 256 bytes to fill first, so........
........try this sequence of events as a starter test mode from root TO assume a 3 wire system only:-
(RTS and CTS should be ignored using the below.)

1) Close down your terminal completely and do a reboot of your machine.
2) In root mode open up a new terminal then...
3) Number 4) below is optional...
4) chmod 666 /dev/ttyS0
5) Check the status of your /dev/ttyS0
6) Note that your stty might need -f instead of -F and may already be at 9600bps...
7) stty -F /dev/ttyS0
8) Set up the on board serial I/O to 9600bps and RAW data transfer, in my case, for PCLinuxOS and Debian.
9) Again note that your stty might need -f instead of -F ...
10) stty -F /dev/ttyS0 9600
11) stty -F /dev/ttyS0 raw
12) Finally, again check the status of your /dev/ttyS0
13) And again, note that your stty might need -f instead of -F ...
14) stty -F /dev/ttyS0
15) Now start printing, (blocks of?), characters to the terminal window...
16) cat < /dev/ttyS0
17) It might take a second or so to fill your default serial buffer and may display a 256 byte  burst on each access so be aware.

Hope this works for you...

Run lsof again. There might be an orphaned process or something. If screen can read it, so can you, it's not special.

Thank you Coorona688

root@meow:/home/ethan#  lsof /dev/ttyS0
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
screen  3871 root    6u   CHR   4,64      0t0 1119 /dev/ttyS0

---------- Post updated at 03:58 PM ---------- Previous update was at 03:29 PM ----------

Thanks Corona668

Here is some more info -

root@meow:/home/ethan# cat < /dev/ttyS0 > myfile
^Z
[1]+  Stopped                 cat < /dev/ttyS0 > myfile
root@meow:/home/ethan# locate myfile
/home/ethan/myfile
root@meow:/home/ethan# cat myfile
root@meow:/home/ethan# cat < /dev/ttyS0 > myfile
^Z
[2]+  Stopped                 cat < /dev/ttyS0 > myfile
root@meow:/home/ethan# chown ethan:ethan myfile
root@meow:/home/ethan# cat < /dev/ttyS0 > myfile
^C
root@meow:/home/ethan# cat myfile
root@meow:/home/ethan# ls -l myfile
-rw-r--r-- 1 ethan ethan 0 Oct  5 15:54 myfile
root@meow:/home/ethan# chmod 777 myfile
root@meow:/home/ethan# ls -l myfile
-rwxrwxrwx 1 ethan ethan 0 Oct  5 15:54 myfile
root@meow:/home/ethan# cat < /dev/ttyS0 > myfile
^Z
[3]+  Stopped                 cat < /dev/ttyS0 > myfile
root@meow:/home/ethan# cat myfile

TIA

Kill that screen session, for good this time, and don't open another. You cannot print it to the screen and expect anything else to be able to open it.

Thanks wisecracker -

root@meow:/home/ethan# stty -F /dev/ttyS0
speed 9600 baud; line = 0;
-brkint -imaxbel
root@meow:/home/ethan#  stty -F /dev/ttyS0 raw
root@meow:/home/ethan# stty -F /dev/ttyS0
speed 9600 baud; line = 0;
min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost
-isig -icanon


15) Now start printing, (blocks of?), characters to the terminal window... 
16) cat < /dev/ttyS0 17) It might take a second or so to fill your 
default serial buffer and may display a 256 byte  burst on each access so be aware.

"Now start printing, (blocks of?), characters to the terminal window.."
How??

TIA

What do you mean how?

If the value being read from the serial port is 0, (zero), then the cursor will not move.
Until the value changes from 33 to 126 you will not see anything printed but the cursor __might__ move by one space.

What is connected to the serial port, /dev/ttyS0?
Does it allow raw transfer? (e.g. Arduino.)

If nothing is connected then obtain a loopback plug as a test piece and plug it into the port.

Once set up and with a loopback plug connected use this untested line:-

printf "Some text to display" > /dev/ttyS0