(Feb 17, '05). This is a work in progress.
This application note discusses Serial RS232 communication between a PC running Windows and a TM #128 temperature module. In fact, this could be extended to virtually any of my temperature and control modules, or indeed to any processor. Typical applications include measurement and perhaps in the case of a thermostat or alarm, acting on the measurement, performing calculations and logging data.
I opted to develop this material using
A demo copy of Liberty Basic is free but there is an annoying time delay each time you desire to compile. There is a $29 version which removes this delay and a $49 version which provides for making executables. Factors in selecting Liberty Basic were ease of use in implementing the serial communications, it widely used and well supported and relatively inexpensive.
I will confess that my knowledge of programming in Basic is limited and it seems as if each day I make some new discovery. However, if I wait to post material I am proud to post, I fear nothing will ever be posted. So, please take this as a possible starting point for your own creative being.
Please note that Liberty Basic is one approach. I make no claim that it is better or worse than any other approach. There are simply so many platforms that I decided to simply implement some samples using Liberty. I decided some time ago that I could not be good at all things and decided to strive to be good in developing the interfacing processors. Programming on the PC side is not one of my peaks of excellence.
The following Liberty Basic programs were tested using Windows 98SE.
Format of the TM #128 Measurement Data
Recall that when the TM #128 unit receives any character, returns the state of the single TTL input and then performs a measurement sequence on each Dallas 1-W sensor found on one run and then on the second run. A sample;
0 00 10 9DD7 26.12 01 10 BD53 26.12 02 28 3C2C 26.32 03 22 5BFC 26.43 10 10 0C26 27.18 11 10 0AD7 27.25 12 26 09CE 27.18 2.55 5.03 >The first line is the state of the single input and is either 0 or 1.
This is then followed by the measurement results from the Dallas devices.
The first digit of the first field identifies the run. The second digit of field 1 is a sequential number which is assigned as each Dallas device is found. Field two identifies the device type. The device code 10 indicates the device is a DS18S20, code 28 is a DS18B20, code 22 is a DS1822 and code 26 is a DS2438. Field three is an abbreviation of the unique serial number assigned by Dallas to each device.
Note that the prompt > may be interpreted as the end of the sequence.
This program initiates a sequence of temperature by the TM #128 each minute. The results are fetched and displayed and also logged to a file. When the user enters any character in the text window, the measurement is halted and the content of the log file is displayed to the window text box.
This program is nearly the same as TM125_1.Bas which was developed for the TM #125. The TM #125 is similar to the TM #128, except it provides only a single run, there is no TTL input, the Dallas measurement data is formatted somewhat differently and it will not accommodate the DS2438 battery monitor. Howver, the discussion associated with the program TM125_1.Bas is equally applicable to Program TM128_1.Bas.
' TM128_1.Bas (Liberty Basic) ' ' Illustrates an interface with temperature module TM #128 ' ' Opens a text box. Opens a logging file d:\data.txt ' ' Every minute sends a character to the TM #128, causing the TM #128 to perform ' measurements on each of the Dallas devices on both Dallas runs. Note that valid ' Dallas devices include the DS18S20 / DS18B20 / DS1822 temperature sensors and the ' Dallas DS2438 battery monitor. ' ' This program fetches each string from the TM #128 using function GetLine$. ' ' The string is then displayed on the terminal. In addition, the file is briefly opened, the ' string is written to the file and the file is closed. ' ' This continues indefinitely, until any character is entered from the terminal. The file is ' then opened and diplsyaed to the terminal. ' ' Illustrates developing a text box, and the use of scan to read a charcter from the keyboard. ' ' Useful for developing data logger applications. ' ' Uses Com2, 9600 baud. ' ' copyright, Peter H Anderson, Baltimore, MD, Feb, '05 Com = 16384 ' size of buffer ' define a box nomainwin WindowWidth = 400 WindowHeight = 300 texteditor #window.te, 0, 0, 391, 254 'The handle for our texteditor is #window.te graphicbox #window.gb, 800, 1, 10, 10 open "kb" for window as #window 'The handle for our window is #window print #window.gb, "when characterInput [getChar]" 'When the user presses a key go to [getChar] print #window, "trapclose [quit]" 'When the user closes our terminal window, go to [quit] print #window.te, "!autoresize"; 'Tell the texteditor to resize with the terminal window print #window, "font courier_new 9"; [top] oncomerror [closecomm] ' not sure if this works open "com2:9600,n,8,1, cs0, ds0" for random as #commhandle call pause 500 ' wait for unit to settle open "d:\data.txt" for output as #log ' open the file close #log TimeOutTime = time$("seconds") TimeOutDate = date$("days") [again] TimeOutTime = TimeOutTime + 60 ' every minute if (TimeOutTime >= 86400000) then TimeOutDate = TimeOutDate + 1 TimeOutTime = TimeOutTime - 86400000 end if print #commhandle, "!" ' send any character x = 0 while x = 0 ' loop until either a string is received or timeout DataLine$ = GetLine$(NumChars) ' NumChars is passed by reference select case case NumChars = -30000 print #window.te, "timeout" exit while case (NumChars = 1) if DataLine$ = ">" then print #window.te, DataLine$ exit while end if if (DataLine$ = "0" OR DataLine$ = "1") Then print #window.te, DataLine$ open "d:\data.txt" for append as #log print #log, DataLine$ ' and write it to the file close #log else print #window.te, "Unknown "; DataLine$ end if case (NumChars > 2) ' probably a vaild string print DataLine$ open "d:\data.txt" for append as #log print #window.te, DataLine$ ' display the string print #log, DataLine$ ' and write it to the file close #log case else print "Unknown error" ' probably an overkill exit while end select wend do print #window.gb, "setfocus" scan ' used for check if activity from the keyboard CurrentDate = date$("days") CurrentTime = time$("seconds") loop until (CurrentTime >= TimeOutTime) AND (CurrentDate >= TimeOutDate) goto [again] [display] ' now open the file display the data open "d:\data.txt" for input as #log while eof(#log) = 0 line input #log, datain$ print #window.te, datain$ wend close #log [Done] Goto [Done] [getChar] 'Whenever the user presses a key, we go here to process it. c$ = Inkey$ ' print #window.te, "at getChar" goto [display] [closecomm] print "Error code: ";ComErrorNumber close #commhandle goto [top] function GetLine$(ByRef StatusFlag) TimeOutTime = time$("milliseconds") TimeOutDate = date$("days") TimeOutTime = TimeOutTime + 3000 ' three seconds if (TimeOutTime >= 86400000) then TimeOutDate = TimeOutDate + 1 TimeOutTime = TimeOutTime - 86400000 end if DataLine$ = "" StatusFlag = 0 NumChars = 0 x=0 while x=0 if lof(#commhandle) <>0 then c$ = input$(#commhandle, 1) select case case c$ = ">" DataLine$ = c$ StatusFlag = 1 ' prompt exit while case c$ = chr$(13) StatusFlag = NumChars exit while case c$ = chr$(10) ' ignore it case else DataLine$ = DataLine$ + c$ NumChars = NumChars + 1 end select else CurrentDate = date$("days") CurrentTime = time$("milliseconds") If (CurrentTime >= TimeOutTime) AND (CurrentDate >= TimeOutDate) Then StatusFlag = -30000 exit while end if end if wend GetLine$ = DataLine$ End Function sub pause mil tcurrent = time$("milliseconds") timeout = tcurrent + mil if timeout > 86400000 then ' roll over at midnight timeout = timeout - 86400000 do tcurrent = time$("milliseconds") loop until (86400000 - tcurrent) > 1000000 end if do tcurrent = time$("milliseconds") loop until (tcurrent >= timeout) end sub end