236 lines
6.4 KiB
Plaintext
236 lines
6.4 KiB
Plaintext
|
|
||
|
Library: RS-232
|
||
|
Author: Teunis van Beelen
|
||
|
Url: http://www.teuniz.net/RS-232/
|
||
|
E-mail: teuniz@protonmail.com
|
||
|
License: GPLv3
|
||
|
|
||
|
Last revision: May 31, 2019
|
||
|
|
||
|
|
||
|
|
||
|
int RS232_OpenComport(int comport_number, int baudrate, const char * mode, int flowctrl)
|
||
|
|
||
|
Opens the comport, comportnumber starts with 0 (see the list of numbers).
|
||
|
Baudrate is expressed in baud per second i.e 115200 (see the list of possible baudrates).
|
||
|
Mode is a string in the form of "8N1", "7E2", etc.
|
||
|
8N1 means eight databits, no parity, one stopbit. If in doubt, use 8N1 (see the list of possible modes).
|
||
|
If flowctrl is set to 0, no flow control is used.
|
||
|
If flowctrl is set to 1, hardware flow control is enabled using the RTS/CTS lines.
|
||
|
Returns 1 in case of an error.
|
||
|
In case the comport is already opened (by another process),
|
||
|
it will not open the port but raise an error instead.
|
||
|
|
||
|
int RS232_PollComport(int comport_number, unsigned char *buf, int size)
|
||
|
|
||
|
Gets characters from the serial port (if any). Buf is a pointer to a buffer
|
||
|
and size the size of the buffer in bytes.
|
||
|
Returns the amount of received characters into the buffer. This can be less than size or zero!
|
||
|
It does not block or wait, it returns immediately, no matter if any characters have been received or not.
|
||
|
After succesfully opening the COM-port, connect this function to a timer.
|
||
|
The timer should have an interval of approx. 20 to 100 milliSeconds.
|
||
|
Do not forget to stop the timer before closing the COM-port.
|
||
|
Allways check the return value! The return value tells you how many bytes
|
||
|
are actually received and present in your buffer!
|
||
|
|
||
|
int RS232_SendByte(int comport_number, unsigned char byte)
|
||
|
|
||
|
Sends a byte via the serial port. Returns 1 in case of an error.
|
||
|
|
||
|
int RS232_SendBuf(int comport_number, unsigned char *buf, int size)
|
||
|
|
||
|
Sends multiple bytes via the serial port. Buf is a pointer to a buffer
|
||
|
and size the size of the buffer in bytes.
|
||
|
Returns -1 in case of an error, otherwise it returns the amount of bytes sent.
|
||
|
This function blocks (it returns after all the bytes have been processed).
|
||
|
|
||
|
void RS232_CloseComport(int comport_number)
|
||
|
|
||
|
Closes the serial port.
|
||
|
|
||
|
void RS232_cputs(int comport_number, const char *text)
|
||
|
|
||
|
Sends a string via the serial port. String must be null-terminated.
|
||
|
|
||
|
int RS232_GetPortnr(const char *devname)
|
||
|
|
||
|
Returns the comport number based on the device name e.g. "ttyS0" or "COM1".
|
||
|
(Doesn't mean the device actually exists!)
|
||
|
Returns -1 when not found.
|
||
|
|
||
|
|
||
|
The following functions are normally not needed but can be used to set or check the status of the control-lines:
|
||
|
================================================================================================================
|
||
|
|
||
|
void RS232_enableDTR(int comport_number)
|
||
|
|
||
|
Sets the DTR line high (active state).
|
||
|
|
||
|
void RS232_disableDTR(int comport_number)
|
||
|
|
||
|
Sets the DTR line low (non active state).
|
||
|
|
||
|
void RS232_enableRTS(int comport_number)
|
||
|
|
||
|
Sets the RTS line high (active state). Do not use this function if hardware flow control is enabled!
|
||
|
|
||
|
void RS232_disableRTS(int comport_number) Do not use this function if hardware flow control is enabled!
|
||
|
|
||
|
Sets the RTS line low (non active state).
|
||
|
|
||
|
int RS232_IsRINGEnabled(int comport_number)
|
||
|
|
||
|
Checks the status of the RING-pin. Returns 1 when the the RING line is high (active state), otherwise 0.
|
||
|
|
||
|
int RS232_IsDSREnabled(int comport_number)
|
||
|
|
||
|
Checks the status of the DSR-pin. Returns 1 when the the DSR line is high (active state), otherwise 0.
|
||
|
|
||
|
int RS232_IsCTSEnabled(int comport_number)
|
||
|
|
||
|
Checks the status of the CTS-pin. Returns 1 when the the CTS line is high (active state), otherwise 0.
|
||
|
|
||
|
int RS232_IsDCDEnabled(int comport_number)
|
||
|
|
||
|
Checks the status of the DCD-pin. Returns 1 when the the DCD line is high (active state), otherwise 0.
|
||
|
|
||
|
|
||
|
The following functions are normally not needed but can be used to empty the rx/tx buffers:
|
||
|
===========================================================================================
|
||
|
|
||
|
("discards data written to the serial port but not transmitted, or data received but not read")
|
||
|
|
||
|
void RS232_flushRX(int comport_number)
|
||
|
|
||
|
Flushes data received but not read.
|
||
|
|
||
|
void RS232_flushTX(int comport_number)
|
||
|
|
||
|
Flushes data written but not transmitted.
|
||
|
|
||
|
void RS232_flushRXTX(int comport_number)
|
||
|
|
||
|
Flushes both data received but not read, and data written but not transmitted.
|
||
|
|
||
|
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
You don't need to call RS232_PollComport() when you only want to send characters.
|
||
|
Sending and receiving do not influence eachother.
|
||
|
|
||
|
The os (kernel) has an internal buffer of 4096 bytes (for traditional onboard serial ports).
|
||
|
USB/Serial-converter drivers use much bigger buffers (multiples of 4096).
|
||
|
If this buffer is full and a new character arrives on the serial port,
|
||
|
the oldest character in the buffer will be overwritten and thus will be lost.
|
||
|
|
||
|
After a successfull call to RS232_OpenComport(), the os will start to buffer incoming characters.
|
||
|
|
||
|
tip: To get access to the serial port on Linux, you need to be a member of the group "dialout".
|
||
|
|
||
|
Note: Traditional (on-board) UART's usually have a speed limit of max. 115200 baud.
|
||
|
Special cards and USB to Serial converters can usually be set to higher baudrates.
|
||
|
|
||
|
|
||
|
List of comport numbers, possible baudrates and modes:
|
||
|
|
||
|
Linux windows
|
||
|
0 ttyS0 COM1
|
||
|
1 ttyS1 COM2
|
||
|
2 ttyS2 COM3
|
||
|
3 ttyS3 COM4
|
||
|
4 ttyS4 COM5
|
||
|
5 ttyS5 COM6
|
||
|
6 ttyS6 COM7
|
||
|
7 ttyS7 COM8
|
||
|
8 ttyS8 COM9
|
||
|
9 ttyS9 COM10
|
||
|
10 ttyS10 COM11
|
||
|
11 ttyS11 COM12
|
||
|
12 ttyS12 COM13
|
||
|
13 ttyS13 COM14
|
||
|
14 ttyS14 COM15
|
||
|
15 ttyS15 COM16
|
||
|
16 ttyUSB0 COM17
|
||
|
17 ttyUSB1 COM18
|
||
|
18 ttyUSB2 COM19
|
||
|
19 ttyUSB3 COM20
|
||
|
20 ttyUSB4 COM21
|
||
|
21 ttyUSB5 COM22
|
||
|
22 ttyAMA0 COM23
|
||
|
23 ttyAMA1 COM24
|
||
|
24 ttyACM0 COM25
|
||
|
25 ttyACM1 COM26
|
||
|
26 rfcomm0 COM27
|
||
|
27 rfcomm1 COM28
|
||
|
28 ircomm0 COM29
|
||
|
29 ircomm1 COM30
|
||
|
30 cuau0 COM31
|
||
|
31 cuau1 COM32
|
||
|
32 cuau2 n.a.
|
||
|
33 cuau3 n.a.
|
||
|
34 cuaU0 n.a.
|
||
|
35 cuaU1 n.a.
|
||
|
36 cuaU2 n.a.
|
||
|
37 cuaU3 n.a.
|
||
|
|
||
|
Linux windows
|
||
|
50 n.a.
|
||
|
75 n.a.
|
||
|
110 110
|
||
|
134 n.a.
|
||
|
150 n.a.
|
||
|
200 n.a.
|
||
|
300 300
|
||
|
600 600
|
||
|
1200 1200
|
||
|
1800 n.a.
|
||
|
2400 2400
|
||
|
4800 4800
|
||
|
9600 9600
|
||
|
19200 19200
|
||
|
38400 38400
|
||
|
57600 57600
|
||
|
115200 115200
|
||
|
230400 128000
|
||
|
460800 256000
|
||
|
500000 500000
|
||
|
576000 n.a.
|
||
|
921600 921600
|
||
|
1000000 1000000
|
||
|
1152000 n.a.
|
||
|
1500000 1500000
|
||
|
2000000 2000000
|
||
|
2500000 n.a.
|
||
|
3000000 3000000
|
||
|
3500000 n.a.
|
||
|
4000000 n.a.
|
||
|
|
||
|
Mode
|
||
|
8N1
|
||
|
8O1
|
||
|
8E1
|
||
|
8N2
|
||
|
8O2
|
||
|
8E2
|
||
|
7N1
|
||
|
7O1
|
||
|
7E1
|
||
|
7N2
|
||
|
7O2
|
||
|
7E2
|
||
|
6N1
|
||
|
6O1
|
||
|
6E1
|
||
|
6N2
|
||
|
6O2
|
||
|
6E2
|
||
|
5N1
|
||
|
5O1
|
||
|
5E1
|
||
|
5N2
|
||
|
5O2
|
||
|
5E2
|
||
|
|
||
|
|