'---------------------------------------------------------------------------------------- ' Name: xuart_functions.tig ' Type: TIGER-BASIC(tm) Source Code ' Release: 1.01a Nov|25|2005 ' Purpose: Contimuous receipt and transmission ' ' (C) - Copyright Wilke Technology, P.O.Box 1727, D-52018 Aachen, Germany '---------------------------------------------------------------------------------------- ' ' Thank you for using BASIC Tigers in your products. If you have questions, ideas ' or special needs, please contact your next distributor or the Tiger support team ' and visit our web site: ' ' Wilke Technology GmbH ' The Tiger Support Team ' P.O.Box 1727, D-52018 Aachen, Germany ' Krefelder Str. 147, D-52070 Aachen, Germany ' ' email: support@wilke-technology.com (english) ' email: support@wilke.de (german) ' Phone: +49 (241) 918 900 Mo to Fr, 7:00 to 16:00 (GMT) ' Fax: +49 (241) 918 9068 ' ' New information, new drivers and free downloads see: ' ' www.wilke-technology.com (english) ' www.wilke.de (german) ' ' Sincerely, ' ' Your Tiger Support Team ' '---------------------------------------------------------------------------------------- ' 'DG---------------------------------------------------------------------------------------- USER_VAR_STRICT USER_VAR_INIT #include define_a.inc ' General definitions #include ufunc3.inc ' User-function-codes #include define_xuart.inc ' defines for SER_XUART driver #include ufunc_xuart.inc ' User-Function-Codes for SER_XUART driver '' additional general definitions #define DUMMY 0 '' xuart driver #define BASE_ADDR 0E0h ' base address of xuart module #define NUM_MODULES 1 ' number of modules #define MODULE_TYPE 0 ' #define CH_A 0 ' channel A #define CH_B 1 ' channel B #define CH_C 2 ' channel C #define CH_D 3 ' channel D '' control frequency #define WAIT_CLOCK 100 '' string sizes #define BUF_STR_SZE 10k #define DEV_STR_SZE 1k '' receipt string buffers string sgARecBuf$(BUF_STR_SZE),sgBRecBuf$(BUF_STR_SZE),sgCRecBuf$(BUF_STR_SZE),sgDRecBuf$(BUF_STR_SZE) '' receipt device strings string sgARec1$(DEV_STR_SZE),sgARec2$(DEV_STR_SZE) string sgBRec1$(DEV_STR_SZE),sgBRec2$(DEV_STR_SZE) string sgCRec1$(DEV_STR_SZE),sgCRec2$(DEV_STR_SZE) string sgDRec1$(DEV_STR_SZE),sgDRec2$(DEV_STR_SZE) '' transmission string buffers string sgATraBuf$(BUF_STR_SZE),sgBTraBuf$(BUF_STR_SZE),sgCTraBuf$(BUF_STR_SZE),sgDTraBuf$(BUF_STR_SZE) '' transmission device strings string sgATra1$(DEV_STR_SZE),sgATra2$(DEV_STR_SZE) string sgBTra1$(DEV_STR_SZE),sgBTra2$(DEV_STR_SZE) string sgCTra1$(DEV_STR_SZE),sgCTra2$(DEV_STR_SZE) string sgDTra1$(DEV_STR_SZE),sgDTra2$(DEV_STR_SZE) '' wait duration to ensure that all bytes has been transmitted long lgWaitTraCtrl task Main install_device #XUART, "SER_XUART.TD2", BASE_ADDR, MODULE_TYPE, NUM_MODULES call vInit() '' start receipt on all channels run_task Receive_A run_task Receive_B run_task Receive_C run_task Receive_D '' start transmission on all channels run_task Transmit_A run_task Transmit_B run_task Transmit_C run_task Transmit_D '' just for testing: '' add byte every second to each buffer while 0=0 sgATraBuf$ = sgATraBuf$ + "A" sgBTraBuf$ = sgBTraBuf$ + "B" sgCTraBuf$ = sgCTraBuf$ + "C" sgDTraBuf$ = sgDTraBuf$ + "D" wait_duration 1000 endwhile end '------------------------------------------------------------------------------------------------ '' transmit stored bytes in transmit buffer of each channel task Transmit_A call Transmit (CH_A, sgATra1$, sgATra2$, sgATraBuf$) end task Transmit_B call Transmit (CH_B, sgBTra1$, sgBTra2$, sgBTraBuf$) end task Transmit_C call Transmit (CH_C, sgCTra1$, sgCTra2$, sgCTraBuf$) end task Transmit_D call Transmit (CH_D, sgDTra1$, sgDTra2$, sgDTraBuf$) end '' tramsmit continously stored bytes in transmit buffer sub Transmit (byte bpChannel; var string spvTra1$, spvTra2$, spvBuffer$) spvTra1$ = "" spvTra2$ = "" while 0=0 '' while first transmit string has not been transmitted completely while len(spvTra1$) > 0 endwhile '' ensure that all bytes has been transmitted completely wait_duration lgWaitTraCtrl '' occasionally cut all received bytes from transmit buffer if len(spvBuffer$) > 0 then spvTra1$ = cut_and_paste$(spvBuffer$,0,DEV_STR_SZE) endif '' put transmit string to device driver put #XUART, #bpChannel, #UFCO_TRANSMIT_DATA_DACC, spvTra1$ '' while second transmit string has not been transmitted completely while len(spvTra2$) > 0 endwhile '' ensure that all bytes has been transmitted completely wait_duration lgWaitTraCtrl '' occasionally cut all received bytes from transmit buffer if len(spvBuffer$) > 0 then spvTra2$ = cut_and_paste$(spvBuffer$,0,DEV_STR_SZE) endif '' put transmit string to device driver put #XUART, #bpChannel, #UFCO_TRANSMIT_DATA_DACC, spvTra2$ endwhile end '------------------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------------------ '' receive on all channels task Receive_A call Receive (CH_A, sgARec1$, sgARec2$, sgARecBuf$) end task Receive_B call Receive (CH_B, sgBRec1$, sgBRec2$, sgBRecBuf$) end task Receive_C call Receive (CH_C, sgCRec1$, sgCRec2$, sgCRecBuf$) end task Receive_D call Receive (CH_D, sgDRec1$, sgDRec2$, sgDRecBuf$) end '' receive continously and add received bytes to global buffer sub Receive (byte bpChannel; var string spvRec1$, spvRec2$, spvBuffer$) spvRec1$ = "" spvRec2$ = "" '' start receiving in first receipt string put #XUART, #bpChannel, #UFCO_RECEIVE_DATA_DACC, spvRec1$ wait_next WAIT_CLOCK while 0=0 '' receive for WAIT_CLOCK ms '' if any byte has been received change receipt string '' and add bytes to receipt buffer wait_next if len(spvRec1$) > 0 then put #XUART, #bpChannel, #UFCO_RECEIVE_DATA_DACC, spvRec2$ spvBuffer$ = spvBuffer$ + spvRec1$ spvRec1$ = "" endif wait_next if len(spvRec2$) > 0 then put #XUART, #bpChannel, #UFCO_RECEIVE_DATA_DACC, spvRec1$ spvBuffer$ = spvBuffer$ + spvRec2$ spvRec2$ = "" endif endwhile end '------------------------------------------------------------------------------------------------ '------------------------------------------------------------------------------------------------ sub vInit () '' reset channels A-D put #XUART, #CH_A, #UFCO_RESET_MODULE, DUMMY '' set channel settings put #XUART, #CH_A, #UFCO_SET_BAUD_PARAMX, BR_57600, (WORD_LENGTH_8 + STOP_BIT_1 + NO_PARITY) put #XUART, #CH_B, #UFCO_SET_BAUD_PARAMX, BR_57600, (WORD_LENGTH_8 + STOP_BIT_1 + NO_PARITY) put #XUART, #CH_C, #UFCO_SET_BAUD_PARAMX, BR_57600, (WORD_LENGTH_8 + STOP_BIT_1 + NO_PARITY) put #XUART, #CH_D, #UFCO_SET_BAUD_PARAMX, BR_57600, (WORD_LENGTH_8 + STOP_BIT_1 + NO_PARITY) sgARecBuf$ = "" sgBRecBuf$ = "" sgCRecBuf$ = "" sgDRecBuf$ = "" sgATraBuf$ = "" sgBTraBuf$ = "" sgCTraBuf$ = "" sgDTraBuf$ = "" '' calculate duration in ms until internal bufferd bytes has been transmitted completely '' (buffered bits)*(start bit+data bits+parity bit+ stop bit)*1000ms/data bits/baudrate lgWaitTraCtrl = ( 128*8 )*( 1 + 8 + 1 + 1 )*1000 /8 /57600 end '------------------------------------------------------------------------------------------------