linux_xspec_rs232/ 0000755 0001750 0000144 00000000000 13064455436 013411 5 ustar xiang users linux_xspec_rs232/xspec.h 0000744 0001750 0000144 00000013537 13063760445 014714 0 ustar xiang users /* the device's vendor and product id */
#ifndef __XSPEC_H__
#define __MYRS232_H__
#define FLASH_PAGE_SIZE 128 //in bytes
#define BUF_SIZE 16000
#define RING_SIZE (1024*128)
#define TRIG_MODE_MAX 2
#define TRIG_MODE_NORMAL 0
#define TRIG_MODE_EXT_HARD_RISING 1
#define TRIG_MODE_EXT_HARD_FALLING 2
#define TRIG_MODE_LIBS_MAX 3
#define TRIG_MODE_LIBS_NORMAL 0
#define TRIG_MODE_LIBS_SHUTTER 1
#define TRIG_MODE_EXT_LIBS_RISING 2
#define TRIG_MODE_EXT_LIBS_FALLING 3
#define ST_SKIP_MIN 0
#define ST_SKIP_MAX 6000000
#define READ_COUNT_MIN 0
#define READ_COUNT_MAX 1000000
#define EXT_TRIG_DELAY_MIN 0
#define EXT_TRIG_DELAY_MAX 65000000
#define INT_TIME_LIBS_NORMAL_MIN 3700
#define INT_TIME_LIBS_SHUTTER_MIN 3
#define INT_TIME_NORMAL_MIN 10
#define INT_S1115X_TIME_NORMAL_MIN 2
#define INT_TIME_NORMAL_MAX 65000000
#define INT_S10420_TIME_NORMAL_MIN 9400
#define RUNNING_AVG_MIN 1
#define RUNNING_AVG_MAX 2000
#define PACKET_START 0xE1
#define ACQ_STATUS_CMD 0x50
#define TRIG_CMD 0x51
#define SET_DARK_CMD 0x52
#define SEND_CMD 0x53
#define SET_ITIME_CMD 0x54
#define ABORT_CMD 0x55
#define READ_NVMEM_CMD 0x56
#define WRITE_NVMEM_CMD 0x57
#define WRITE_SETTING_CMD 0x58 //update memory only, not flash
#define WRITE_PROG_CMD 0x59
#define READ_TEMP 0x5a
#define SET_PULSEMODE_CMD 0x5b
#define READ_VERSION_CMD 0x5d
#define READ_TEMP_CMD 0x5e
#define USB_RESET 0x5F
#define TRIG_CMD_REPEAT 0x60
#define READ_NVMEM_PRG 0x61
#define SET_ITIME_NOFLASH_CMD 0x62
#define START_PWM_CMD 0x63
#define END_PWM_CMD 0x64
#define UPGRADE_CMD 0x65
#define ADJUST_BIAS_CMD 0x66
//command from RS232 , no repeat
#define RS_TRIG_CMD 0x80
#define RS_SET_ITIME_CMD 0x81
#define RS_READ_NVMEM_CMD 0x82
#define RS_WRITE_NVMEM_CMD 0x83
#define RS_START_PWM_CMD 0x84
#define RS_END_PWM_CMD 0x85
#define RS_ABORT_CMD 0x86
#define RS_USB_RESET 0x87
#define RS_WRITE_SETTING_CMD 0x88 //update memory only, not flash
#define RS_WRITE_PROG_CMD 0x89
#define RS_READ_NVMEM_PRG 0x8A
#define RS_ADJUST_BIAS_CMD 0x8B
#define RS_TRIG_CMD_PARTIAL 0x8C
#define ET_TRIG_CMD 0x90
#define ET_SET_ITIME_CMD 0x91
#define ET_READ_NVMEM_CMD 0x92
#define ET_WRITE_NVMEM_CMD 0x93
#define ET_START_PWM_CMD 0x94
#define ET_END_PWM_CMD 0x95
#define ET_ABORT_CMD 0x96
#define ET_USB_RESET 0x97
#define ET_TRIG_CMD_REPEAT 0x98
#define ET_READ_NVMEM_PRG 0x99
#define ET_WRITE_SETTING_CMD 0x9a //update memory only, not flash
#define ET_WRITE_PROG_CMD 0x9b
#define ET_UPGRADE_CMD 0x9c
#define ET_FIND_DEV_CMD 0x9D
#define ET_CHANGE_IP_CMD 0x9E
#define ET_ADJUST_BIAS_CMD 0x9F
// acq. status
#define WG_ACQ_DONE 8 // acq. finished
#define WG_ACQ_ABORT 4 // acq. aborted
#define WG_ACQ_WAIT_HWTRIG 1 // waiting for hardware trigger
#define WG_ACQ_INTEGRATING 2 // sensor is integrating
#define WG_ACQ_WAIT_SFTRIG 3
typedef struct {
unsigned int integration_time; //for regular mode 4
unsigned int int_mode; //mode , normal or e-shutter mode 12, used as 0-63 for sub-microsecond control
unsigned int trig_mode; //trigger mode; 0-4 16
unsigned int extern_trigger_delay; // delay time in 0.5us for external trigger 20
unsigned int st_skip; //24
unsigned int dark_offset; //28
unsigned int LAMP_PWM0; // duty and period
unsigned int LAMP_PWM1; // scale, div, lowhigh
unsigned int multiple_count; // 0xFFFF means infinite 40
unsigned int lamp_mode; //44
unsigned int dir_port; //48
unsigned int port; //52
unsigned int temp;
unsigned int flash_size;
unsigned int flash_page_size;
unsigned int flash_setting_start;
unsigned int start_auto_adj_dc_bias;
unsigned int average;
unsigned int int_time;
unsigned int trigger_out;
/*
-- 31/30 mode 11=external trigger, 01 shutter mode, 00 normal mode
-- bit 29-28 out 1 mode
-- bit 27-26 out 2 mode
-- bit 25-24 out 3 mode
-- bit 23-21, default value for out1,2,3
-- bit 20, 0 rising ext edge, 1 falling ext edge
-- bit 15-0, skip number
*/
unsigned int shutter_idle_time;
unsigned int out1_delay;
unsigned int out1_width;
unsigned int out2_delay;
unsigned int out2_width;
unsigned int out3_delay;
unsigned int out3_width;
unsigned int reserve[5];
} SYSTEM_SETTING_TYPE;
typedef struct {
unsigned int description[4];//16
unsigned int firmware_version[4];//32
unsigned int serial[4];//48
unsigned int detector[4];//64
unsigned int grating[4];//80
unsigned int entrance_filter[4];//96
unsigned int slit_size[4];//112
unsigned int sorting_filter[3];//124
unsigned int pixels; //128
} SYSTEM_SETTING_STRING;
#define NUMBER_COEF 6
#define NUMBER_COEF_MAX 12
typedef struct {
double wave_start; // 8
double wave_end; // 16
double user_coef[NUMBER_COEF];// 64
double system_coef[NUMBER_COEF];// 112
unsigned int BIAS_PWM; // 116
unsigned short coef_order; //116
unsigned short reserve; //120
unsigned short dark_start; //118
unsigned short dark_end; //120
unsigned short data_start; //122
unsigned short data_end; //124
} SYSTEM_SETTING_COEF;
typedef struct {
unsigned int user_name[16];//16
unsigned int date_string[8];//16
unsigned int time_string[8];//16
} SYSTEM_SETTING_NAME;
typedef struct {
unsigned char mac[6];
unsigned char ip[4];
unsigned char gate[4];
unsigned char mask[4];
unsigned int tcp_port;
unsigned int http_port;
unsigned char use_this;
unsigned char reserved[101];
} SYSTEM_SETTING_TCP;
typedef struct
{
double detector_coef[16];// 112
} SYSTEM_LINEARITY_COEF;
#endif
linux_xspec_rs232/rs232.h 0000744 0001750 0000144 00000004374 13064200356 014433 0 ustar xiang users /*
***************************************************************************
*
* Author: Teunis van Beelen
*
* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Teunis van Beelen
*
* Email: teuniz@gmail.com
*
***************************************************************************
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
***************************************************************************
*/
/* Last revision: July 10, 2016 */
/* For more info and how to use this library, visit: http://www.teuniz.net/RS-232/ */
#ifndef rs232_INCLUDED
#define rs232_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
#include
#include
#if defined(__linux__) || defined(__FreeBSD__)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#else
#include
#endif
int RS232_OpenComport(int, int, const char *);
int RS232_PollComport(int, unsigned char *, int);
int RS232_SendByte(int, unsigned char);
int RS232_SendBuf(int, unsigned char *, int);
void RS232_CloseComport(int);
void RS232_cputs(int, const char *);
int RS232_IsDCDEnabled(int);
int RS232_IsCTSEnabled(int);
int RS232_IsDSREnabled(int);
void RS232_enableDTR(int);
void RS232_disableDTR(int);
void RS232_enableRTS(int);
void RS232_disableRTS(int);
void RS232_flushRX(int);
void RS232_flushTX(int);
void RS232_flushRXTX(int);
int RS232_GetPortnr(const char *);
int RS232_SelectR(int comport_number, int sec, int usec);
int RS232_SelectW(int comport_number, int sec, int usec);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif
linux_xspec_rs232/interface.h 0000744 0001750 0000144 00000041241 13064455377 015531 0 ustar xiang users // The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the INTERFACE_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// INTERFACE_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef INTERFACE_EXPORTS
#define INTERFACE_API
#else
#define INTERFACE_API
#endif
#include "xspec.h"
#define INFINITE 0
#define ONE_SEC 1000
#define TWO_SEC 2000
#define FIVE_SEC 5000
#if 0
// Scan for XPSEC devices and create a internal linked list of attached devices.
// Call this first before any other function.
// return number of XSPEC devices ; <0 error.
extern "C" INTERFACE_API int XSPEC_scan_usb_for_spec(void);
//print all XSPEC USB structure
extern "C" INTERFACE_API void XSPEC_print_Spec();
// call to delete allocated data structures when program is shutting down.
extern "C" INTERFACE_API void XSPEC_usb_cleanup();
//return number of XPSECs connected. call scan_sub_for_spec first.
extern "C" INTERFACE_API int XSPEC_getNumConnectedSpectrometers(void);
//open the XSPEC device by devnum, devnum is stored in the USB_SPEC structure
extern "C" INTERFACE_API usb_dev_handle *XSPEC_open_Spec(char devnum);
//call this to close the usb device. 0==success, < 0 on error.
extern "C" INTERFACE_API int XSPEC_close_Spec(USB_SPEC *node);
// retrieve the XSPEC device data structure by index.
// 0==success, -1 error
extern "C" INTERFACE_API int XSPEC_get_Spec(unsigned int index, USB_SPEC *node);
// set the integration time in usec for the current_devnum
// return the number of bytes sent for the command, must be larger than 0.
extern "C" INTERFACE_API int XSPEC_setIntegrationTime(USB_SPEC *ptr,unsigned int time_us);
// return the integration time in usec for the current_devnum
// -1==failure,
extern "C" INTERFACE_API int XSPEC_getIntegrationTime(USB_SPEC *ptr);
// 4 data structure stored in the flash. return one of them, use index (0,1,2,3) to indicate which one.
// pre-allocate the space for p_data, it is 128bytes. cast to the structure defined in myusb.h
// -1==failure, 0==success
extern "C" INTERFACE_API int XSPEC_get_SpecConfig0123(USB_SPEC *ptr,char *p_data, int index);
// 4 data structure stored in the flash. return one of them, use index (0,1,2,3) to indicate which one.
// create the data for p_data, it is 128bytes. use get_SpecConfig() to get the entire structure. Modify the one you need
// to change and put the data structure back using this function.
// return number of bytes sent, -1==failure,
extern "C" INTERFACE_API int XSPEC_write_SpecConfig(USB_SPEC *ptr,char *p_data, int index);
//only update the setting0 in memory, not update the flash
extern "C" INTERFACE_API int XSPEC_update_config_mem(USB_SPEC *ptr,char *p_data);
// download program page by page into the flash. index start from 0, page_size is the flash page size, it may differ depending on which ucontroller is used. 128 or 256
// return number of bytes sent, -1==failure,
extern "C" INTERFACE_API int XSPEC_write_SpecProg(USB_SPEC *ptr,char *p_data, unsigned int page_size, int index);
//only send the read command,
extern "C" INTERFACE_API int XSPEC_get_SpecConfig_async(USB_SPEC *ptr);
//retrieve the 4 data structures stored in the flash and save them locally.
// 0==success, -1==failure.
extern "C" INTERFACE_API int XSPEC_get_SpecConfig(USB_SPEC *ptr);
//retrieve a page from the flash
// 0==success, -1==failure.
extern "C" INTERFACE_API int XSPEC_get_SpecProg(USB_SPEC *ptr, unsigned short page);
// dump the 4 data structures using printf
// // 0==success, else==failure
extern "C" INTERFACE_API int XSPEC_print_config(USB_SPEC *ptr);
// pre-allocate BUF_SIZE for the data_array, id is an unique ID to distingusish multiple users accessing the same device.
// passed integ_time help determine how long to wait for the data. in usec; integ_time/1000+1000ms
// return number of bytes received. <=0 indicates error.
/*
Each pixel is 2 bytes, (16bits).
PIXEL 19-31 (including 31) are dark pixels. Normally , average is taken and used for subtraction.
Start pixel is 35,
for(tmp=START_DARK;tmpground+=buffer[tmp];
}
ptr1->ground=ptr1->ground/TOTAL_DARK;
For data:
for(tmp=START_PIXEL;tmpreal_integ_time & 0x80000000)
temp.Format(_T("S%dus"), current_data->real_integ_time& 0x7FFFFFFF);
else
{
double dtemp;
unsigned int integ;
dtemp=(double)current_data->real_integ_time;
dtemp=dtemp/3.0+0.5;
integ=(unsigned int)dtemp;
temp.Format(_T("N%dus"), integ);
}
[6] ID, passed in XSPEC_measure. if EXTERNAL Trig, default is #define EXT_TRIG_ID 0xE1234567, overwritten by ID in XSPEC_measure
[7] TEMPERATURE
double temperature; //0.3v at 25c, 5.7X amplification 3.3=1023
unsigned int bits;
bits=ptr_data[7];
temperature=bits& 0xFFFF;
bits=bits>>16;
if(bits==0)
{
temperature=temperature/1023.0*3.3;
temperature=((temperature/5.7)-0.3)*1000.0+25.0;
}
else
{
double max;
double volt;
max=pow(2.0,(int)bits&0xff);
volt=bits>>8;
volt=volt/10;
temperature=(double)temperature/max*volt;
temperature=((temperature/5.7)-0.3)*1000.0+25.0;
}
TRACE(_T("***********************************temp =%x %lf\n"),ptr_data[7],temperature );
*/
extern "C" INTERFACE_API int XSPEC_measure(USB_SPEC *ptr,unsigned short *data_array, unsigned int id, unsigned int integ_time);
//only send the command, return right away, return bytes sent.
extern "C" INTERFACE_API int XSPEC_measure_async(USB_SPEC *ptr,unsigned int id);
// initiate continous read mode. Only send a command. returns bytes sent
// User needs to implement their own method (thread) to retrieve and process continous data flow.
extern "C" INTERFACE_API int XSPEC_continous_measure_async(USB_SPEC *ptr,unsigned int id);
//stop spectrometer from sending data.
extern "C" INTERFACE_API int XSPEC_measure_stop(USB_SPEC *ptr);
extern "C" INTERFACE_API int XSPEC_pwm_start(USB_SPEC *ptr, int which);
extern "C" INTERFACE_API int XSPEC_pwm_stop(USB_SPEC *ptr, int which);
// Used to help user retrieve continous data in a thread.
// Put this function in a while loop inside a thread.
// return number of bytes read, <=0 indicate timeout.
extern "C" INTERFACE_API int XSPEC_continous_wait(USB_SPEC *ptr,unsigned short *data_array, unsigned int integration_time);
// Restart the device. goto address "0"
extern "C" INTERFACE_API int XSPEC_reset(USB_SPEC *node);
extern "C" INTERFACE_API int XSPEC_upgrade(USB_SPEC *node);
//only supported with DAC installed. adjust the DAC to reach average count of 90 for the dark signal
extern "C" INTERFACE_API int XSPEC_adjust_bias(USB_SPEC *node);
extern "C" INTERFACE_API double XSPEC_get_temperature(unsigned int bits);
#endif
//RS232
#define PIXELS 3684
#define TCD1304_DATA_START 0
#define TCD1304_DATA_END 3647
extern "C" INTERFACE_API int XSPEC_rs232_upgrade(unsigned char portnr);
//open the XSPEC device by comm port number 0,1,2,3,4...
extern "C" INTERFACE_API int XSPEC_rs232_open(unsigned char portnr);
//call this to close the rs232. 0==success, < 0 on error.
extern "C" INTERFACE_API int XSPEC_rs232_close(unsigned char portnr);
// set the integration time in usec for the current_devnum
// return the number of bytes sent for the command, must be larger than 0.
extern "C" INTERFACE_API int XSPEC_rs232_setIntegrationTime(unsigned char portnr,unsigned int time_us);
// set the integration time in usec for the current_devnum, stays in FLASH
// return the number of bytes sent for the command, must be larger than 0.
extern "C" INTERFACE_API int XSPEC_rs232_setIntegrationTimeFlash(unsigned char portnr,unsigned int time_us);
// set the integration mode for the current_devnum, stays in FLASH
// mode 0: normal. software
// mode 1: rising external edge
// mode 2: falling external edge
// return the number of bytes sent for the command, must be larger than 0.
extern "C" INTERFACE_API int XSPEC_rs232_setModeFlash(unsigned char portnr,unsigned int mode);
// set the firmware averaging for the current_devnum, stays in FLASH
// return the number of bytes sent for the command, must be larger than 0.
extern "C" INTERFACE_API int XSPEC_rs232_setAverageFlash(unsigned char portnr,unsigned int average);
// return the integration time in usec for the current_devnum
// -1==failure,
extern "C" INTERFACE_API int XSPEC_rs232_getIntegrationTime(unsigned char portnr);
// return the firmware average number.
// -1==failure,
extern "C" INTERFACE_API int XSPEC_rs232_getFirmwareAverage(unsigned char portnr);
// return the trigger mode
// -1==failure,
extern "C" INTERFACE_API int XSPEC_rs232_getMode(unsigned char portnr);
// 4 data structure stored in the flash. return one of them, use index (0,1,2,3) to indicate which one.
// pre-allocate the space for p_data, it is 128bytes. cast to the structure defined in myusb.h
// -1==failure, 0==success
extern "C" INTERFACE_API int XSPEC_rs232_get_SpecConfig0123(unsigned char portnr, char *p_data, int index);
// 4 data structure stored in the flash. return one of them, use index (0,1,2,3) to indicate which one.
// create the data for p_data, it is 128bytes. use get_SpecConfig() to get the entire structure. Modify the one you need
// to change and put the data structure back using this function.
// return number of bytes sent, -1==failure,
extern "C" INTERFACE_API int XSPEC_rs232_write_SpecConfig(unsigned char portnr,char *p_data, int index);
//only update the setting0 in memory, not update the flash
extern "C" INTERFACE_API int XSPEC_rs232_update_config_mem(unsigned char portnr,char *p_data);
//retrieve the 4 data structures stored in the flash and save them locally.
// 0==success, -1==failure.
extern "C" INTERFACE_API int XSPEC_rs232_get_SpecConfig(unsigned char portnr);
// dump the 4 data structures using printf
// // 0==success, else==failure
extern "C" INTERFACE_API int XSPEC_rs232_print_config(unsigned char portnr);
// pre-allocate BUF_SIZE for the data_array, id is an unique ID to distingusish multiple users accessing the same device.
// passed integ_time help determine how long to wait for the data. in usec; integ_time/1000+1000ms
// return number of bytes received. <=0 indicates error.
extern "C" INTERFACE_API int XSPEC_rs232_measure(unsigned char portnr,unsigned short *data_array, unsigned int id, unsigned int integ_time);
// pre-allocate BUF_SIZE for the data_array, id is an unique ID to distingusish multiple users accessing the same device.
// passed integ_time help determine how long to wait for the data. in usec; integ_time/1000+1000ms
// pass rs_start and rs_end 36-3683 for normal operation. SAM3U
// return number of bytes received. <=0 indicates error.
extern "C" INTERFACE_API int XSPEC_rs232_measure_partial(unsigned char portnr,unsigned short *data_array, unsigned int id, unsigned int integ_time, unsigned short rs_start, unsigned short rs_end);
extern "C" INTERFACE_API int XSPEC_rs232_pwm_start(unsigned char portnr, int which);
extern "C" INTERFACE_API int XSPEC_rs232_pwm_stop(unsigned char portnr, int which);
// stop transmission,
extern "C" INTERFACE_API int XSPEC_rs232_abort(unsigned char portnr);
// Restart the device. goto address "0"
extern "C" INTERFACE_API int XSPEC_rs232_reset(unsigned char portnr);
extern "C" INTERFACE_API int XSPEC_rs232_measure_stop(unsigned char portnr);
extern "C" INTERFACE_API int XSPEC_rs232_get_SpecProg(unsigned char portnr, unsigned short page);
extern "C" INTERFACE_API int XSPEC_rs232_upgrade(unsigned char portnr);
//only supported with DAC installed. adjust the DAC to reach average count of 90 for the dark signal
extern "C" INTERFACE_API int XSPEC_rs232_adjust_bias(unsigned char portnr);
extern "C" INTERFACE_API int XSPEC_rs232_Sync(unsigned char portnr,unsigned char val);
#if 0
extern "C" INTERFACE_API int XSPEC_eth_udp_setIntegrationTime(SOCKET connect_socket, unsigned int time_us, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_getIntegrationTime(SOCKET connect_socket, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_print_config(SOCKET connect_socket, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_get_SpecConfig0123(SOCKET connect_socket, char *p_data, int index, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_update_config_mem(SOCKET connect_socket, char *p_data, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_write_SpecConfig(SOCKET connect_socket, char *p_data, int index, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_reset(SOCKET connect_socket, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_pwm_start(SOCKET connect_socket, int which, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_pwm_stop(SOCKET connect_socket, int which, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_get_SpecConfig_async(SOCKET connect_socket, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_get_SpecConfig(SOCKET connect_socket, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API SOCKET XSPEC_eth_udp_open_Spec(char *ip, int port);
extern "C" INTERFACE_API SOCKET XSPEC_eth_udp_close_Spec(SOCKET connect_socket);
extern "C" INTERFACE_API int XSPEC_eth_udp_get_SpecProg(SOCKET connect_socket, unsigned short page, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_upgrade(SOCKET connect_socket, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_write_SpecProg(SOCKET connect_socket,char *p_data, unsigned int page_size, int index, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_measure(SOCKET connect_socket, unsigned short *data_array, unsigned int id, unsigned int integ_time, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_measure_stop(SOCKET connect_socket, struct sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_measure_async(SOCKET connect_socket, unsigned int id, struct sockaddr_in *sock_addr, int len);
extern "C" INTERFACE_API int XSPEC_eth_udp_continous_measure_async(SOCKET connect_socket, unsigned int id, struct sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_continous_wait(SOCKET connect_socket, unsigned short *data_array);
extern "C" INTERFACE_API int XSPEC_eth_udp_find_dev(SOCKET connect_socket, sockaddr_in *sock_addr, int size);
extern "C" INTERFACE_API int XSPEC_eth_udp_change_ip(SOCKET connect_socket, sockaddr_in *sock_addr, int size, unsigned char *old_ip, unsigned char *new_ip, unsigned int port);
extern "C" INTERFACE_API int XSPEC_eth_adjust_bias(SOCKET connect_socket, struct sockaddr_in *sock_addr, int size);
#endif linux_xspec_rs232/README.txt 0000744 0001750 0000144 00000004616 13064256604 015113 0 ustar xiang users Control XSPEC with RS232 on LINUX.
1. Check the Makefile, make sure the path match with your system, and run make.
Make sure your root, or set the RS232 device to correct permission.
RS232 XSPEC_CONTROL usage:
-d #: com port number. ttyS0=0, ttyS1=1...ttyUSB0=16, ttyUSB1=17..ttyAMA0=22 check rs232 for details
-M #: mode 0 normal software trigger, 1 rising ext HW, 2 falling ext HW trigger.
-a #: firmware averaging.
-i: get integration time
-I #: Set Integration Time in RAM
-L #: Set Integration Time in FLASH
-c: Dump Config data
-m: Get a measurement.
-n #: read # time and take average.
-p: Get a partial measurement.
-s #: start pixel 0-3647
-e #: start pixel 0-3647
common commands:
Read the integration time:
root@slackware:/home/xiang/work/linux_xspec_rs232# ./xspec_rs232_linux_test -
d 16 -i
RS232_SendBuf bstatus=5, writelen=5
got 90 want 776
got 115 want 686
got 116 want 571
got 115 want 455
got 116 want 340
got 115 want 224
got 109 want 109
RS232_PollComport bstatus=776, want to read=776
RS232_SendBuf bstatus=5, writelen=5
got 91 want 776
got 115 want 685
got 116 want 570
got 115 want 454
got 116 want 339
got 115 want 223
got 108 want 108
RS232_PollComport bstatus=776, want to read=776
Trigger mode for comport 16=1
Integration Time for comport 16=10
RS232_SendBuf bstatus=5, writelen=5
got 88 want 776
got 115 want 688
got 116 want 573
got 115 want 457
got 115 want 342
got 127 want 227
got 100 want 100
RS232_PollComport bstatus=776, want to read=776
Firmware Average for comport 16=10
Set the Integration time:
root@slackware:/home/xiang/work/xspec_usb_linux_example# ./xspec_rs232_linux_test
-d16 -I1000
root@slackware:/home/xiang/work/xspec_usb_linux_example# ./xspec_rs232_linux_test
-d16 -i
Integration Time for device Number 69=1000
Take a measurement:
./xspec_rs232_linux_test -d16 -m
Take 10 measurement and print the average
./xspec_rs232_linux_test -d16 -n10 -m
Dump out config data:
./xspec_rs232_linux_test -d16 -c
Take partial spectrum. Make sure Version using 3U4 or 3AC chipset:
./xspec_rs232_linux_test -d16 -s 10 -e 20 -p
To change setting, read all the config and modify the entries, and then write them back. Use the following functions:
XSPEC_rs232_get_SpecConfig0123
XSPEC_rs232_write_SpecConfig
See the XSPEC_rs232_setAverageFlash and interface_rs232 for examples.
linux_xspec_rs232/rs232.c 0000744 0001750 0000144 00000055522 13064252615 014434 0 ustar xiang users /*
***************************************************************************
*
* Author: Teunis van Beelen
*
* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Teunis van Beelen
*
* Email: teuniz@gmail.com
*
***************************************************************************
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
***************************************************************************
*/
/* Last revision: July 10, 2016 */
/* For more info and how to use this library, visit: http://www.teuniz.net/RS-232/ */
#include
#include "rs232.h"
#if defined(__linux__) || defined(__FreeBSD__) /* Linux & FreeBSD */
#define RS232_PORTNR 38
#define RS232_DEBUG
#ifdef RS232_DEBUG
#define PRINT printf
#else
#define PRINT
#endif
int Cport[RS232_PORTNR],
error;
struct termios new_port_settings,
old_port_settings[RS232_PORTNR];
const char *comports[RS232_PORTNR]= {"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2","/dev/ttyS3","/dev/ttyS4","/dev/ttyS5",
"/dev/ttyS6","/dev/ttyS7","/dev/ttyS8","/dev/ttyS9","/dev/ttyS10","/dev/ttyS11",
"/dev/ttyS12","/dev/ttyS13","/dev/ttyS14","/dev/ttyS15","/dev/ttyUSB0",
"/dev/ttyUSB1","/dev/ttyUSB2","/dev/ttyUSB3","/dev/ttyUSB4","/dev/ttyUSB5",
"/dev/ttyAMA0","/dev/ttyAMA1","/dev/ttyACM0","/dev/ttyACM1",
"/dev/rfcomm0","/dev/rfcomm1","/dev/ircomm0","/dev/ircomm1",
"/dev/cuau0","/dev/cuau1","/dev/cuau2","/dev/cuau3",
"/dev/cuaU0","/dev/cuaU1","/dev/cuaU2","/dev/cuaU3"
};
int RS232_OpenComport(int comport_number, int baudrate, const char *mode)
{
int baudr,
status;
if((comport_number>=RS232_PORTNR)||(comport_number<0))
{
printf("illegal comport number\n");
return(1);
}
switch(baudrate)
{
case 50 :
baudr = B50;
break;
case 75 :
baudr = B75;
break;
case 110 :
baudr = B110;
break;
case 134 :
baudr = B134;
break;
case 150 :
baudr = B150;
break;
case 200 :
baudr = B200;
break;
case 300 :
baudr = B300;
break;
case 600 :
baudr = B600;
break;
case 1200 :
baudr = B1200;
break;
case 1800 :
baudr = B1800;
break;
case 2400 :
baudr = B2400;
break;
case 4800 :
baudr = B4800;
break;
case 9600 :
baudr = B9600;
break;
case 19200 :
baudr = B19200;
break;
case 38400 :
baudr = B38400;
break;
case 57600 :
baudr = B57600;
break;
case 115200 :
baudr = B115200;
break;
case 230400 :
baudr = B230400;
break;
case 460800 :
baudr = B460800;
break;
case 500000 :
baudr = B500000;
break;
case 576000 :
baudr = B576000;
break;
case 921600 :
baudr = B921600;
break;
case 1000000 :
baudr = B1000000;
break;
case 1152000 :
baudr = B1152000;
break;
case 1500000 :
baudr = B1500000;
break;
case 2000000 :
baudr = B2000000;
break;
case 2500000 :
baudr = B2500000;
break;
case 3000000 :
baudr = B3000000;
break;
case 3500000 :
baudr = B3500000;
break;
case 4000000 :
baudr = B4000000;
break;
default :
printf("invalid baudrate\n");
return(1);
break;
}
int cbits=CS8,
cpar=0,
ipar=IGNPAR,
bstop=0;
if(strlen(mode) != 3)
{
printf("invalid mode \"%s\"\n", mode);
return(1);
}
switch(mode[0])
{
case '8':
cbits = CS8;
break;
case '7':
cbits = CS7;
break;
case '6':
cbits = CS6;
break;
case '5':
cbits = CS5;
break;
default :
printf("invalid number of data-bits '%c'\n", mode[0]);
return(1);
break;
}
switch(mode[1])
{
case 'N':
case 'n':
cpar = 0;
ipar = IGNPAR;
break;
case 'E':
case 'e':
cpar = PARENB;
ipar = INPCK;
break;
case 'O':
case 'o':
cpar = (PARENB | PARODD);
ipar = INPCK;
break;
default :
printf("invalid parity '%c'\n", mode[1]);
return(1);
break;
}
switch(mode[2])
{
case '1':
bstop = 0;
break;
case '2':
bstop = CSTOPB;
break;
default :
printf("invalid number of stop bits '%c'\n", mode[2]);
return(1);
break;
}
/*
http://pubs.opengroup.org/onlinepubs/7908799/xsh/termios.h.html
http://man7.org/linux/man-pages/man3/termios.3.html
*/
Cport[comport_number] = open(comports[comport_number], O_RDWR | O_SYNC| O_NOCTTY | O_NDELAY );
if(Cport[comport_number]==-1)
{
perror("unable to open comport ");
return(1);
}
// else
// fcntl(Cport[comport_number], F_SETFL, 0);
/* lock access so that another process can't also use the port */
if(flock(Cport[comport_number], LOCK_EX | LOCK_NB) != 0)
{
close(Cport[comport_number]);
perror("Another process has locked the comport.");
return(1);
}
error = tcgetattr(Cport[comport_number], old_port_settings + comport_number);
if(error==-1)
{
close(Cport[comport_number]);
flock(Cport[comport_number], LOCK_UN); /* free the port so that others can use it. */
perror("unable to read portsettings ");
return(1);
}
memset(&new_port_settings, 0, sizeof(new_port_settings)); /* clear the new struct */
new_port_settings.c_cflag = cbits | cpar | bstop | CLOCAL | CREAD;
new_port_settings.c_cflag &= ~CRTSCTS ;
new_port_settings.c_iflag = ipar;
new_port_settings.c_oflag = 0;
new_port_settings.c_lflag = 0;
new_port_settings.c_cc[VMIN] = 0; /* block untill n bytes are received */
new_port_settings.c_cc[VTIME] = 0; /* block untill a timer expires (n * 100 mSec.) */
cfsetispeed(&new_port_settings, baudr);
cfsetospeed(&new_port_settings, baudr);
error = tcsetattr(Cport[comport_number], TCSANOW, &new_port_settings);
if(error==-1)
{
tcsetattr(Cport[comport_number], TCSANOW, old_port_settings + comport_number);
close(Cport[comport_number]);
flock(Cport[comport_number], LOCK_UN); /* free the port so that others can use it. */
perror("unable to adjust portsettings ");
return(1);
}
tcflush(Cport[comport_number], TCIFLUSH);
/* http://man7.org/linux/man-pages/man4/tty_ioctl.4.html */
/* if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
{
tcsetattr(Cport[comport_number], TCSANOW, old_port_settings + comport_number);
flock(Cport[comport_number], LOCK_UN); // free the port so that others can use it.
perror("unable to get portstatus");
return(1);
}
status |= TIOCM_DTR; // turn on DTR
status |= TIOCM_RTS; // turn on RTS
if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
{
tcsetattr(Cport[comport_number], TCSANOW, old_port_settings + comport_number);
flock(Cport[comport_number], LOCK_UN); //free the port so that others can use it.
perror("unable to set portstatus");
return(1);
}
*/
return(0);
}
int RS232_PollComport(int comport_number, unsigned char *buf, int size)
{
int n;
int bytes_avaiable=0;
int left;
unsigned char *buf_ptr=buf;
left=size;
while(left>0)
{
ioctl(Cport[comport_number], FIONREAD, &bytes_avaiable);
while(bytes_avaiable==0)
{
usleep(10000);
ioctl(Cport[comport_number], FIONREAD, &bytes_avaiable);
PRINT("got %d want %d\n", bytes_avaiable, left);
}
n = read(Cport[comport_number], buf_ptr, bytes_avaiable);
if(n < 0)
{
if(errno == EAGAIN) return 0;
}
buf_ptr+=n;
left-=n;
}
return(size-left);
}
int RS232_SendByte(int comport_number, unsigned char byte)
{
int n = write(Cport[comport_number], &byte, 1);
if(n < 0)
{
if(errno == EAGAIN)
{
return 0;
}
else
{
return 1;
}
}
return(0);
}
int RS232_SendBuf(int comport_number, unsigned char *buf, int size)
{
int bStatus=RS232_SelectW(comport_number, 1, 0); //give it two second
if (bStatus <= 0)
{
return(-1);
// error processing code goes here
}
int n = write(Cport[comport_number], buf, size);
if(n < 0)
{
if(errno == EAGAIN)
{
return 0;
}
else
{
return (-1);
}
}
return(n);
}
int RS232_SelectW(int comport_number, int sec, int usec)
{
fd_set set;
struct timeval timeout;
int rv;
FD_ZERO(&set); /* clear the set */
FD_SET(Cport[comport_number], &set); /* add our file descriptor to the set */
timeout.tv_sec = sec;
timeout.tv_usec = usec;
rv = select(Cport[comport_number] + 1, NULL, &set, NULL, &timeout);
if(rv == -1)
perror("select"); /* an error accured */
else if(rv == 0)
printf("selectW timeoutx"); /* a timeout occured */
return(rv);
}
int RS232_SelectR(int comport_number, int sec, int usec)
{
fd_set set;
struct timeval timeout;
int rv;
FD_ZERO(&set); /* clear the set */
FD_SET(Cport[comport_number], &set); /* add our file descriptor to the set */
timeout.tv_sec = sec;
timeout.tv_usec = usec;
rv = select(Cport[comport_number] + 1, &set, NULL, NULL, &timeout);
if(rv == -1)
perror("select"); /* an error accured */
else if(rv == 0)
printf("selectR timeoutx"); /* a timeout occured */
return(rv);
}
void RS232_CloseComport(int comport_number)
{
int status;
if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
{
perror("unable to get portstatus");
}
status &= ~TIOCM_DTR; /* turn off DTR */
status &= ~TIOCM_RTS; /* turn off RTS */
if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
{
perror("unable to set portstatus");
}
tcsetattr(Cport[comport_number], TCSANOW, old_port_settings + comport_number);
close(Cport[comport_number]);
flock(Cport[comport_number], LOCK_UN); /* free the port so that others can use it. */
}
/*
Constant Description
TIOCM_LE DSR (data set ready/line enable)
TIOCM_DTR DTR (data terminal ready)
TIOCM_RTS RTS (request to send)
TIOCM_ST Secondary TXD (transmit)
TIOCM_SR Secondary RXD (receive)
TIOCM_CTS CTS (clear to send)
TIOCM_CAR DCD (data carrier detect)
TIOCM_CD see TIOCM_CAR
TIOCM_RNG RNG (ring)
TIOCM_RI see TIOCM_RNG
TIOCM_DSR DSR (data set ready)
http://man7.org/linux/man-pages/man4/tty_ioctl.4.html
*/
int RS232_IsDCDEnabled(int comport_number)
{
int status;
ioctl(Cport[comport_number], TIOCMGET, &status);
if(status&TIOCM_CAR) return(1);
else return(0);
}
int RS232_IsCTSEnabled(int comport_number)
{
int status;
ioctl(Cport[comport_number], TIOCMGET, &status);
if(status&TIOCM_CTS) return(1);
else return(0);
}
int RS232_IsDSREnabled(int comport_number)
{
int status;
ioctl(Cport[comport_number], TIOCMGET, &status);
if(status&TIOCM_DSR) return(1);
else return(0);
}
void RS232_enableDTR(int comport_number)
{
int status;
if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
{
perror("unable to get portstatus");
}
status |= TIOCM_DTR; /* turn on DTR */
if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
{
perror("unable to set portstatus");
}
}
void RS232_disableDTR(int comport_number)
{
int status;
if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
{
perror("unable to get portstatus");
}
status &= ~TIOCM_DTR; /* turn off DTR */
if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
{
perror("unable to set portstatus");
}
}
void RS232_enableRTS(int comport_number)
{
int status;
if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
{
perror("unable to get portstatus");
}
status |= TIOCM_RTS; /* turn on RTS */
if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
{
perror("unable to set portstatus");
}
}
void RS232_disableRTS(int comport_number)
{
int status;
if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
{
perror("unable to get portstatus");
}
status &= ~TIOCM_RTS; /* turn off RTS */
if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
{
perror("unable to set portstatus");
}
}
void RS232_flushRX(int comport_number)
{
tcflush(Cport[comport_number], TCIFLUSH);
}
void RS232_flushTX(int comport_number)
{
tcflush(Cport[comport_number], TCOFLUSH);
}
void RS232_flushRXTX(int comport_number)
{
tcflush(Cport[comport_number], TCIOFLUSH);
}
#else /* windows */
#define RS232_PORTNR 16
HANDLE Cport[RS232_PORTNR];
char *comports[RS232_PORTNR]= {"\\\\.\\COM1", "\\\\.\\COM2", "\\\\.\\COM3", "\\\\.\\COM4",
"\\\\.\\COM5", "\\\\.\\COM6", "\\\\.\\COM7", "\\\\.\\COM8",
"\\\\.\\COM9", "\\\\.\\COM10", "\\\\.\\COM11", "\\\\.\\COM12",
"\\\\.\\COM13", "\\\\.\\COM14", "\\\\.\\COM15", "\\\\.\\COM16"
};
char mode_str[128];
int RS232_OpenComport(int comport_number, int baudrate, const char *mode)
{
if((comport_number>=RS232_PORTNR)||(comport_number<0))
{
printf("illegal comport number\n");
return(1);
}
switch(baudrate)
{
case 110 :
strcpy(mode_str, "baud=110");
break;
case 300 :
strcpy(mode_str, "baud=300");
break;
case 600 :
strcpy(mode_str, "baud=600");
break;
case 1200 :
strcpy(mode_str, "baud=1200");
break;
case 2400 :
strcpy(mode_str, "baud=2400");
break;
case 4800 :
strcpy(mode_str, "baud=4800");
break;
case 9600 :
strcpy(mode_str, "baud=9600");
break;
case 19200 :
strcpy(mode_str, "baud=19200");
break;
case 38400 :
strcpy(mode_str, "baud=38400");
break;
case 57600 :
strcpy(mode_str, "baud=57600");
break;
case 115200 :
strcpy(mode_str, "baud=115200");
break;
case 128000 :
strcpy(mode_str, "baud=128000");
break;
case 256000 :
strcpy(mode_str, "baud=256000");
break;
case 500000 :
strcpy(mode_str, "baud=500000");
break;
case 1000000 :
strcpy(mode_str, "baud=1000000");
break;
default :
printf("invalid baudrate\n");
return(1);
break;
}
if(strlen(mode) != 3)
{
printf("invalid mode \"%s\"\n", mode);
return(1);
}
switch(mode[0])
{
case '8':
strcat(mode_str, " data=8");
break;
case '7':
strcat(mode_str, " data=7");
break;
case '6':
strcat(mode_str, " data=6");
break;
case '5':
strcat(mode_str, " data=5");
break;
default :
printf("invalid number of data-bits '%c'\n", mode[0]);
return(1);
break;
}
switch(mode[1])
{
case 'N':
case 'n':
strcat(mode_str, " parity=n");
break;
case 'E':
case 'e':
strcat(mode_str, " parity=e");
break;
case 'O':
case 'o':
strcat(mode_str, " parity=o");
break;
default :
printf("invalid parity '%c'\n", mode[1]);
return(1);
break;
}
switch(mode[2])
{
case '1':
strcat(mode_str, " stop=1");
break;
case '2':
strcat(mode_str, " stop=2");
break;
default :
printf("invalid number of stop bits '%c'\n", mode[2]);
return(1);
break;
}
strcat(mode_str, " dtr=on rts=on");
/*
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363145%28v=vs.85%29.aspx
http://technet.microsoft.com/en-us/library/cc732236.aspx
*/
Cport[comport_number] = CreateFileA(comports[comport_number],
GENERIC_READ|GENERIC_WRITE,
0, /* no share */
NULL, /* no security */
OPEN_EXISTING,
0, /* no threads */
NULL); /* no templates */
if(Cport[comport_number]==INVALID_HANDLE_VALUE)
{
printf("unable to open comport\n");
return(1);
}
DCB port_settings;
memset(&port_settings, 0, sizeof(port_settings)); /* clear the new struct */
port_settings.DCBlength = sizeof(port_settings);
if(!BuildCommDCBA(mode_str, &port_settings))
{
printf("unable to set comport dcb settings\n");
CloseHandle(Cport[comport_number]);
return(1);
}
if(!SetCommState(Cport[comport_number], &port_settings))
{
printf("unable to set comport cfg settings\n");
CloseHandle(Cport[comport_number]);
return(1);
}
COMMTIMEOUTS Cptimeouts;
Cptimeouts.ReadIntervalTimeout = MAXDWORD;
Cptimeouts.ReadTotalTimeoutMultiplier = 0;
Cptimeouts.ReadTotalTimeoutConstant = 0;
Cptimeouts.WriteTotalTimeoutMultiplier = 0;
Cptimeouts.WriteTotalTimeoutConstant = 0;
if(!SetCommTimeouts(Cport[comport_number], &Cptimeouts))
{
printf("unable to set comport time-out settings\n");
CloseHandle(Cport[comport_number]);
return(1);
}
return(0);
}
int RS232_PollComport(int comport_number, unsigned char *buf, int size)
{
int n;
/* added the void pointer cast, otherwise gcc will complain about */
/* "warning: dereferencing type-punned pointer will break strict aliasing rules" */
ReadFile(Cport[comport_number], buf, size, (LPDWORD)((void *)&n), NULL);
return(n);
}
int RS232_SendByte(int comport_number, unsigned char byte)
{
int n;
WriteFile(Cport[comport_number], &byte, 1, (LPDWORD)((void *)&n), NULL);
if(n<0) return(1);
return(0);
}
int RS232_SendBuf(int comport_number, unsigned char *buf, int size)
{
int n;
if(WriteFile(Cport[comport_number], buf, size, (LPDWORD)((void *)&n), NULL))
{
return(n);
}
return(-1);
}
void RS232_CloseComport(int comport_number)
{
CloseHandle(Cport[comport_number]);
}
/*
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363258%28v=vs.85%29.aspx
*/
int RS232_IsDCDEnabled(int comport_number)
{
int status;
GetCommModemStatus(Cport[comport_number], (LPDWORD)((void *)&status));
if(status&MS_RLSD_ON) return(1);
else return(0);
}
int RS232_IsCTSEnabled(int comport_number)
{
int status;
GetCommModemStatus(Cport[comport_number], (LPDWORD)((void *)&status));
if(status&MS_CTS_ON) return(1);
else return(0);
}
int RS232_IsDSREnabled(int comport_number)
{
int status;
GetCommModemStatus(Cport[comport_number], (LPDWORD)((void *)&status));
if(status&MS_DSR_ON) return(1);
else return(0);
}
void RS232_enableDTR(int comport_number)
{
EscapeCommFunction(Cport[comport_number], SETDTR);
}
void RS232_disableDTR(int comport_number)
{
EscapeCommFunction(Cport[comport_number], CLRDTR);
}
void RS232_enableRTS(int comport_number)
{
EscapeCommFunction(Cport[comport_number], SETRTS);
}
void RS232_disableRTS(int comport_number)
{
EscapeCommFunction(Cport[comport_number], CLRRTS);
}
/*
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363428%28v=vs.85%29.aspx
*/
void RS232_flushRX(int comport_number)
{
PurgeComm(Cport[comport_number], PURGE_RXCLEAR | PURGE_RXABORT);
}
void RS232_flushTX(int comport_number)
{
PurgeComm(Cport[comport_number], PURGE_TXCLEAR | PURGE_TXABORT);
}
void RS232_flushRXTX(int comport_number)
{
PurgeComm(Cport[comport_number], PURGE_RXCLEAR | PURGE_RXABORT);
PurgeComm(Cport[comport_number], PURGE_TXCLEAR | PURGE_TXABORT);
}
#endif
void RS232_cputs(int comport_number, const char *text) /* sends a string to serial port */
{
while(*text != 0) RS232_SendByte(comport_number, *(text++));
}
/* return index in comports matching to device name or -1 if not found */
int RS232_GetPortnr(const char *devname)
{
int i;
char str[32];
#if defined(__linux__) || defined(__FreeBSD__) /* Linux & FreeBSD */
strcpy(str, "/dev/");
#else /* windows */
strcpy(str, "\\\\.\\");
#endif
strncat(str, devname, 16);
str[31] = 0;
for(i=0; i