PDA

View Full Version : SERIN confusion on receiving a string of characters.



CuriousOne
- 29th September 2022, 05:59
Hello.
I want to do the following -
receive the data from serial port, and after code for enter is received, write next characters received into an array, and display that text on screen (8 characters total) when enter received again.

Something like this:

User presses enter and then types HELLO and enter again
and my screen displays HELLO.
If user typed in more than 8 characters before pressing the enter, just last 8 characters he entered are displayed.
As I understand, I need SERIN for this, and it should look like this:



edk:
SERIN PORTB.6,2,[13],textline[0],textline[1],textline[2],textline[3],textline[4],textline[5],textline[6],textline[7]
pause 100
gosub deka 'array to screen decoder
goto edk


I have USB2SERIAL converter TXD pin connected to PORTB.6 via 22k resistor, as PBP manual says.
Trying to send some characters via teraterm, but get nothing written into array.
I checked usb2serial adapter and it is working.

What I'm doing wrong?

Ioannis
- 29th September 2022, 07:00
Since you don't show rest of the code, only guessing I can make.

1. Try to short tx-rx of the USB converter to make sure it is working
2. The 22K maybe too large. Try a 4K7
3. The array textline needs to be filled with 8 characters before serin exits. If you type less then it just waits there forever
4. Serin will hang if the voltage input is not correct. Even if you add timeout....!
5. Are you sure your display subroutine is OK?

Ioannis

HenrikOlsson
- 29th September 2022, 11:03
What sort of USB-to-serial is this?
The fact that you're using a 22k resistor indicates the converter is an "USB-to-RS232" converter which means you should use N9600 (Mode 6) when the RS232-signal is connected (via resistor) to the PIC. Your code, on the other hand, uses T9600 (Mode 2) indicating that the converter is "USB-to-UART" in which case the resistor isn't really needed. Also, make sure you have the GND of the converter connected to GND of PIC and - obviously - that you have selected the correct baudrate in whatever terminal program you're using.

As usual, get the basics going first BEFORE you try to fill arrays, using wait characters, timeouts and so on.

CuriousOne
- 29th September 2022, 13:56
Decoder routine and other code works fine. I'll check other things too later. I already tried setting mode 6, no difference.

The USB<>Serial converter is common one, based on CH340 chip.

9285

CuriousOne
- 1st October 2022, 19:47
Issue solved.
While manual says "Pin is automatically made an input."
In fact it does not, so I made that pin an input via TRIS register and now (mode 6) works fine.

Now how to change above code, so it displays text immediately after pressing the enter, not waiting for 8 characters to fill in?

Ioannis
- 1st October 2022, 20:21
Page 211 of the manual for the SERIN2 command

Use STR ArrayVar\n{\c} where the c is the 13 (enter).

Ioannis

CuriousOne
- 1st October 2022, 22:06
Like this?

serin2 portb.6,16468,[WAIT(13),STR textline\8]

It works, but with big delay and not repsonding to "ENTER"
actually, it only works when 8 characters are typed in a row quickly...

Ioannis
- 1st October 2022, 22:28
More like this

serin2 portb.6,16468,[STR textline\8\13]

It will exit either filling 8 characters in the textline or earlier if you hit enter

If you want also to start filling textline after first enter then use this (not recommended though):

serin2 portb.6,16468,[WAIT(13),STR textline\8\13]

because serin may get confused which enter is, first or last. Better use different character for start and finish.

Ioannis

CuriousOne
- 1st October 2022, 23:14
Wow thanks!
it works like Charm!

Ioannis
- 2nd October 2022, 12:13
Great !

But if you need start character better be different than stop character.

Ioannis

CuriousOne
- 22nd November 2022, 20:38
Tried to use this with arduino, instead of RS-232. But it does not work, since polarity is inverted.
Added simple 1 transistor inverter and everything is fine, but maybe it is possible to modify PBP settings for SERIN2 to accept "inverted" serial data?

HenrikOlsson
- 23rd November 2022, 06:16
Not sure what you mean by "arduino, instead of RS-232" but if you take a look at the SERIN2 section of the manual you'll find:

Mode is used to specify the baud rate and operating parameters of the serial transfer.
The low order 13 bits select the baud rate. Bit 13 selects parity or no parity. Bit 14
selects inverted or true level. Bit-15 is not used.

and

Bit 14 selects the level of the data and flow control pins. If bit 14 = 0, the data is
received in true form for use with RS-232 drivers. If bit14 = 1, the data is received
inverted. This mode can be used to avoid installing RS232 drivers.

So if 16468 works WITH external inverter then flipping bit 14 should make it work WITHOUT external inverter.

Ioannis
- 23rd November 2022, 08:25
Needless to say that everything regarding Serin and Serin2 is in the manual with detail.

Cannot see connection of the above to Arduino...

Ioannis

CuriousOne
- 23rd November 2022, 18:19
The polarity of input signal. Not the byte or bit inversion, but voltage inversion.

like discussed here: https://forum.arduino.cc/t/software-way-of-inverting-signal-on-arduino-due-serial-port-usartclass/535584/6

Ioannis
- 23rd November 2022, 18:38
Both are related. The RS232 protocol says that the line stays inactive at -12volt and the TTL output is at 5V at the same time. This forces you to have the appropriate inverter driver chip like MAX232 for example.

If you do not want to use that chip then you have to make your TTL output stay at 0Volts to fool RS232 line and if you are lucky (as is the case most of the times) the other end of the RS232 line will understand that TTL output is idling.

Hope this makes sense now.

Ioannis

CuriousOne
- 24th November 2022, 17:04
I know about hardware level converters.
I'm asking another question. Whenever is it possible for SERIN to treat input 0 as 1 and vice versa?

Ioannis
- 24th November 2022, 20:30
When you flip bit 14 as Henrik clearly stated at #12

Ioannis

CuriousOne
- 25th November 2022, 05:04
Yes sorry, just noticed that post
forum is glitching too much recent days...

CuriousOne
- 27th November 2022, 20:20
Tried changing that bit, the result is 18516.
Now it does not work at all....

Ioannis
- 27th November 2022, 21:41
Define speed, parity, polarity.

Ioannis

tumbleweed
- 27th November 2022, 21:45
Tried changing that bit, the result is 18516.
Now it does not work at all....

Not sure what you "flipped", but 18516 = $4854

You had 16468 = $4054.

bit 14 = 16384 = $4000, so flipping bit 14 should give you
$4054 - $4000 = $0054, which is 84 dec

CuriousOne
- 28th November 2022, 06:31
Seems like I've flipped bit #12, not 14 :)
Tried your solution, it works fine, thanks!

CuriousOne
- 11th December 2022, 08:26
Very interesting issue, this works fine with CH340 USB to serial bridge, but does not work that well with HT42B534 USB to serial bridge - characters are received only seldomly, with long delay. This can be hardware issue or?