Serial com-port communication with autoIt
December 7, 2008 at 5:12 pm 14 comments
This weekend I found out how to read from / write to a com port with autoIt code. I created a file with some functions that read/write single characters or lines. To communicate with a com port, I use the CreateFile function from Kernel32.dll. This is my first script where I call dll functions from within autoIt, so perhaps the code can be cleaned up some more.
First, we’ll create a handle to the CreateFile function to open the com port (com2 in this example):
#include <WinAPI.au3>
;init DLL function, we need handle to call the function
$h = DllCall("Kernel32.dll", "hwnd", "CreateFile", "str", "\\.\COM2", "int", BitOR($GENERIC_READ,$GENERIC_WRITE), "int", 0, "ptr", 0, "int", $OPEN_EXISTING, "int", $FILE_ATTRIBUTE_NORMAL, "int", 0)
$handle=$h[0]
To write a single character, I created the writeChar function:
;write a single char
func writeChar($handle,$c)
$stString = DLLStructCreate("char str")
$lpNumberOfBytesWritten = 0
DllStructSetData($stString, 1, $c)
$res = _WinAPI_WriteFile($handle, DllStructGetPtr($stString, "str"), 1, $lpNumberOfBytesWritten)
if ($res<>true) then
ConsoleWrite ( _WinAPI_GetLastErrorMessage() & @LF)
EndIf
EndFunc
A struct that contains a single character is created first. On the third line the character is passed to this struct. Then the _WinAPI_WriteFile function is called with the struct as argument. If everything is ok, then the character is written to the com port! The other functions work in a similar manner, and can be found in the attachment.
This code is very usefull to communicate with microcontrollers, like a PIC uC for example. I was already able to communicate with Matlab (see my other article) which is very usefull for plotting sensor values. The autoIt communication is usefull for remote controlling Windows applications. A simple demo app to illustrate this:
autoIt Code:
#include "pcSide2.au3" While 1 $data = readLineBlock($handle) ConsoleWrite(">" & $data) switch $data case "L" & @LF send("{MEDIA_PREV}") case "R" & @LF send("{MEDIA_NEXT}") case "U" & @LF send("{VOLUME_UP}") case "D" & @LF send("{VOLUME_DOWN}") case "C" & @LF send("{MEDIA_PLAY_PAUSE}") EndSwitch Wend
PIC code:
while (1) { if (!(BUTTON_CENTER)) { //BUTTON_CENTER pressed fprintf (_H_USART, "C\n"); while(!(BUTTON_CENTER)); //wait till button released } if (!(BUTTON_UP)) { //BUTTON_UP pressed fprintf (_H_USART, "U\n"); while(!(BUTTON_UP)); //wait till button released } ... }
So the autoIt code just waits for characters to be sent. If one of the characters U,D,L,R or C is sent (the characters come from Up,Down,Left,Right,Center in case you’re wondering), autoIt will emulate a keypress of one of the Media functions.
The PIC code will send one of the characters when a certain button is pressed. So we are able to remote controll our media player (e.g. Windows Media Player) with our PIC uC!
Attachments:
[ com functions for autoIt ] 2kB
[ demo Application (autoIt code) ] 0kB
Entry filed under: Uncategorized. Tags: autoIt, com port, dll, PIC, PIC18F, serial.
14 Comments Add your own
Leave a comment
Trackback this post | Subscribe to the comments via RSS Feed
1. Serial com-port communication with autoIt « Kr3l’s Turf | corporated.net | December 7, 2008 at 5:32 pm
[…] Serial com-port communication with autoIt « Kr3l’s Turf […]
2. jchd | December 13, 2008 at 1:53 pm
Thank you very much for sharing your solution. It just sounds like this is the simple and efficient way to perform simple tasks using serial links from AutoIt.
I have been delaying starting up on a little “project” (an overkill name for such small thing) involving some protocol transform between low-cost shipping scales and a proprietary shipping software. I’ve even been tempted to have a little box with some PIC inside to perform the task transparently, but it’ll really much simpler to perform an equivalent task with some AutoIt script doing the conversion on the fly and stuffing weights at the right place in the input form.
So thank you again, I bet your code will do wonders.
3. kr3l | December 17, 2008 at 11:47 am
Thanks for your comment 🙂
4. praveen | July 8, 2009 at 7:03 am
Hi,
i cant able to run your code,
I get the error mesage $GENERIC_READ,$GENERIC_WRITE are not defined I dont know which value we want to give for those variables.
i want to read some sensor outputs from serial port(COM3)[rs232].I would like to plot that values in autoit gui.please give me any idea to resolve this problum.my mail id is pravymon_at_gmail.com
5. Karel | July 8, 2009 at 7:22 am
Hi,
did you include WinAPI.au3 in your code?
Karel
6. pixeldoc | May 31, 2010 at 12:56 am
Nice example!
Sadly the Attachment links are dead. Could you please fix them?
Thanks.
7. bob.mcnair | August 20, 2010 at 9:58 am
Dear Karel
Unfortunately the links above don’t work.
Can you please send me a working example of the pcside.au3?
Thanks for your support!
Cheers,
bob.
8. Karel | August 20, 2010 at 10:32 am
Hi Bob,
I’m sorry the links don’t work anymore. I’ll check this evening if I can find the code back and place it online.
Regards,
Karel
9. Karel | August 20, 2010 at 9:15 pm
Hi again Bob,
Turned out I had to renew my account with Freehostia, but the files were still there. So the links work again!
Greets,
Karel
10. koby | May 4, 2011 at 2:02 pm
How do you control COM settings such as BAUD rate and parity?
Thanks,
Koby
11. Trevor | June 21, 2013 at 8:12 pm
Understand this is old. But you have what I was looking for. Any chance you could re-post your code library?
12. Adina | April 20, 2016 at 3:02 pm
Hello! Is it possible to attach again the files from links: com functions for autoIt and demo Application (autoIt code)? Thank you
13. Marc Elser | April 22, 2016 at 6:11 am
downloads have gone. Can you please repost?
14. Cheeroke | September 19, 2017 at 8:09 am
Hello,
do you know how to change/controll Baud rate used for communication?