Introductions:
Serial communication is very important tools required in programming, its serial functions must be learned by a programmer too. In some electronic interfacing we frequently use serial interfacing RS232,RS485 and etc.
Requirements:
Gambas 2 interpreter/compiler
gb.net project component
Objectives:
1) To discuss the use of serial communications
2) To discuss the function of serial interface using gambas2
3) To demonstrate a simple program in gambas2
Methodology:
0) check the availability of serial port device " ls -l /dev/ttyS* "
1) check the ownership of "uccp" -default is owned by "root"
2) Open Gambas2
3) Add gb.net in the project component
3) Create a form
4) Specify setting in COM port:
Data bits
Flow control
Parity
Portname
Speed
Stopbits
Detail(1) Project properties to choose serial components
Detail(2) Icon for serial component
Detail(3) Serial Comm properties
Detail(4) Cut and paste source code
PRIVATE SComm AS SerialPort CONST None AS Integer = 0
PRIVATE Rx AS String PUBLIC SUB Form_Open()
SComm = NEW SerialPort AS "SComm"
SComm.PortName = "/dev/ttyUSB0"
SComm.Speed = "19200"
SComm.Parity = 0
SComm.DataBits = "8"
SComm.StopBits = "1"
SComm.FlowControl = 0
TRY
SComm.Open()
IF ERROR THEN
TRY
SComm.PortName = "/dev/ttyS0"
SComm.Speed = "19200"
SComm.Parity = 0
SComm.DataBits = "8"
SComm.StopBits = "1"
SComm .FlowControl = 0
SComm.Open()
IF ERROR THEN
Message("No Serial Come Exiting...")
QUIT
ENDIF
ENDIF
END 'Private RX
'******** Incoming serial data ********
PUBLIC SUB SComm _Read()
SLEEP 0.025
TRY READ #SComm , Rx, Lof(SComm )
IF ERROR THEN
Message.info(No received data!)
ENDIF
IF Len(Rx) > 8 THEN
TextBox1.Text= Cstr(Rx)
END IF
END
PUBLIC SUB Form_Close()
SComm.Close()
QUIT
END
Detail(5) Error message if serial port is not availableDetail(6): Checking serial port "ls -l /dev/ttyS*"
Detail(7) chown -R group.user /dev/ttyS0
Detail(8) Running serial interface -gambas2 example
Remarks:
Hints:
Problem: Can't open serial port#
1) Create a user and group to add it uucp(if you don't have a login-name)
root@localhost#groupmod –-add-user user_name uucp
2) change ownership (if you t have a login-name)
root@localhost# chown -R your_group.your_user /dev/ttyS0
Still on evaluations, and we hope that gambas2 developers
would add more features in the serial functions.
Problem: Can't have a faster read via serial port?
1) Try to empty first the buffer before reading the next data
buffer =""
buffer=read_serial()
2) of course you can adjust the faster baud rate your host device is capable too.
Conclusions:
A simple serial interfacing
E^3
Hello folks!
ReplyDeleteHoping that we've solved all your problem in Gambas2 serial interfacing
Hi, I'm writing a program to support GPSa logger. The program
ReplyDeletecorrectly handles reading data from the GPS device via bluetooth. But
when I try to read data through USB is unfortunately the program does
not receive anything. And here I am in the place because I do not know
if it's my fault configuration (maybe more-capable port control
settings) or the fault lies with the Lubuntu (and maybe my laptop?).
By the console command: cat / dev/ttyUSB0 I get the whole sequence of
NMEA data from GPS devices. My program connects to the USB port but it
does not get any data. I removed the code limits the size of data
downloaded. It did not help. Reading from / dev/rfcomm0 (bluetooth)
works perfectly. Maybe someone has an idea where I could deal with it.
Below the code to connect with the port and receive data:
PUBLIC SUB button_polacz_Click()
WITH SerialPort1
.PortName = Trim(tbPortName.Text)
.Speed = vb_baudrate.Value
END WITH
IF SerialPort1.Status = 0 THEN
SerialPort1.Open
Timer1.Delay = vb_timerdelay.Value
Timer1.Start
status_portu()
Timer2.Start
button_polacz.Enabled = FALSE
Button1.Enabled = TRUE
ENDIF
CATCH
message.Error((Error.Code) & (Error.text) & (Error.Where))
END
PUBLIC SUB odbierz_dane()
SLEEP 0.025
dane_port = ""
READ #SerialPort1, dane_port, Lof(SerialPort1)
PRINT dane_port
IF dane_port <> "" AND Len(dane_port) > 300 AND Left$(dane_port,
1) = "$" THEN
rozdziel_dane()
ENDIF
CATCH
PRINT (Error.Code) & (Error.text) & (Error.Where)
END
Hello Sir Leszek,
ReplyDeleteActually when I read your problem you were interfacing it to a USB port and you are reading it to a serial port(?).
My advise ; you need to have a virtual COM port for your USB interface.It will catch data from USB protocol and convert it to a RS232 protocol (Serial port) -then you will read something(provided also with correct port config)
1) Pyserial port can give you the idea
2) Pseudo Terminal in Linux
http://en.wikipedia.org/wiki/Pseudo_terminal
3) or you need a USB to serial adapter(this is easy and cheap also.
Thanks
E^3
Problem solved. I typed too little value baudrate. Thanks for your interest and ideas. PySerial particularly intrigued me.
ReplyDeleteHi Sir LeszekK,
ReplyDeleteWow,that's good for you.
You can try the Gambas2 example code on serial port application if you want.
Cheers!
E^3
i'm implanted your exempl for rs232 and gambas, nn, "Unexpected'- Read' la ligne 37 dans Fmain.Class".
ReplyDeleteHi dijalilosse,
DeleteGood Day.
Please give me your dummy e-mail , so that I can give you the gambas-example source code in using serial port.
Let's see then what errors will come.
Thanks
-Christopher
Mr Christopher hi, I find another example of gambas2 Laison with rs232, it works fine, my problem how can I display the string generated by this carracteres Laison, on my project, I give you my email so I send you gtkterm images (image of the chain) the image of the same project or code sourcecomme. thank you Mr
ReplyDeleteEmail: adelghouari@hotmail.fr
Adel
Hi Sir adelghouari,
DeleteI've already send you the serial port source code found in a gambas-example..try to run that code , that was tested.
If ever there will be a bugs just post the infos here.
Cheers!
-E^3
Hi Adelghouari,
DeleteYou can try this..
=====================================================
1) Make a function to return the Rx string
PUBLIC SUB SComm _Read() as STRING
SLEEP 0.025
TRY READ #SComm , Rx, Lof(SComm )
IF ERROR THEN
Message.info(No received data!)
ENDIF
RETURN Rx
END
2) Insert TextBox in Rx a string
PUBLIC SUB SComm _Read() as String
SLEEP 0.025
TRY READ #SComm , Rx, Lof(SComm )
IF ERROR THEN
Message.info(No received data!)
ELSE
Textbox1.Text=Cstr(Rx)
ENDIF
END
=====================================================
Cheers!
E^3
hi Christopher thank you,
ReplyDeleteI will test if there is any, I contacted you, thank you again
hi djalilosse,
ReplyDeleteYou're Welcome...
I will try to add some more Gambas tutorials in my free time..
E^3
Philippines
yes you are right, no problem, and thank you, my problem, the program displays the following string in a Axxx.xx TextArea1, the fonnction it uses to display this string is 'READ # Sport, s, Lof (Sport)', it works right here, oky
ReplyDeleteNow I try how can I treat this chain, ie, this string consists of a carractère and numbers a + "." separator on delphi fonnction I used the copy which copies the string (ch = copy (string, i, 1), and another important function length (string).
both are based delphi function, I want to know the equivalent of these functions under gambas2
Hi djalilosse,
DeleteGood Day.
You can use the string manipulation of Gambas2
ex: Comp(), Letf$(),Right$()
In this code example I am decoding the string which contains a "SRF04" word then following the condition after
(1)
IF (Comp(Left$(s, 5), "SRF04") = 0) THEN
'then here is what you will do??
ENDIF
(2) Or replace some word contain in the string ,etc.
distance=Replace$(s,"distance","")
Hope this helps..
Cheer!
-E^3
hello dear friend, I will try this code, and I inform you of the results
ReplyDeletehonesty, friend E ^ 3
Adel
hello my friend E^3: I treated the string, "A 125.25 ohms" here's the code:
ReplyDeleteFOR IInd = 1 TO Len ("s")
TextBox1.Text = Replace (TextArea1.Text & S, "A", "") 'to clear A
TextBox1.Text = Left $ (TextBox1.Text & s, -10) 'to take the numbers and display them in a textbox (125.25)
I continue this review process
thank you
Adel
Hi dijalilosse,
DeleteYou may subscribe this blog by joining this site above.
And please let us know the progress in your project so that we can post it here..
Your welcome and cheers!
-E^3
Philippines
nice, it's work. how about if i connect my arduino to raspi with rx tx wire ? i think it will be different program, but i don't know, please give me the answer ^^
ReplyDeleteHi Aldi,
ReplyDeleteYes it will work,just follow the same procedure
and issue this command in the cli "ls-lst /dev/ttyU* " to know the available serial ports.
cheers!
-E^3
http://gambaslinux.fr/articles.php?lng=en&pg=2022
ReplyDelete