
打开同星的TSMaster,推荐用32版本的,比64更稳定。同星的TSMaster的C小程序支持用户嵌入代码来控制CAN报文的收发逻辑。便于开发。

点击设计里面的C小程序。
比如我现在想用小程序来实现继电器0先开后关开1s关1s,然后继电器1开1s关1s...如此往复到继电器39
定义全局变量
c
if(flag)
{
flag = 0;
CAN_Data[0] = relay_ch;
CAN_Data[1] = 0x0;
{
// [1] CAN 0x240D BOB_BOX_SET_ONE_RELAY_STATE_REQ 控制单个继电器
TCAN f0 = {0,0x5,2,0,0x240D,0,{0}};
memcpy(f0.FData, CAN_Data, 8);
com.transmit_can_async(&f0);
app.wait(0, "");
}
relay_ch++;
if(relay_ch == 40)
relay_ch = 0;
}
else
{
flag = 1;
CAN_Data[0] = relay_ch;
CAN_Data[1] = 0x1;
{
// [1] CAN 0x240D BOB_BOX_SET_ONE_RELAY_STATE_REQ 控制单个继电器
TCAN f0 = {0,0x5,2,0,0x240D,0,{0}};
memcpy(f0.FData, CAN_Data, 8);
com.transmit_can_async(&f0);
app.wait(0, "");
}
}
可以直接报文转化为C脚本
也可以根据帮助手册手写。
TCAN类型是什么?可以在TSMaster.h里面看到。
c
// CAN frame type ================================================
typedef struct _TCAN{
u8 FIdxChn;
u8 FProperties;
u8 FDLC;
u8 FReserved;
s32 FIdentifier;
s64 FTimeUs;
u8 FData[8];
// is_tx -----------------------------------------------------
bool get_is_tx(void)
{
return (FProperties & MASK_CANProp_DIR_TX) != 0;
}
void set_is_tx(const bool value)
{
if (value) {
FProperties = FProperties | MASK_CANProp_DIR_TX;
} else {
FProperties = FProperties & (~MASK_CANProp_DIR_TX);
}
}
__declspec(property(get = get_is_tx, put = set_is_tx)) bool is_tx;
// is_data ----------------------------------------------------
bool get_is_data(void)
{
return (FProperties & MASK_CANProp_REMOTE) == 0;
}
void set_is_data(const bool value)
{
if (value) {
FProperties = FProperties & (~MASK_CANProp_REMOTE);
} else {
FProperties = FProperties | MASK_CANProp_REMOTE;
}
}
__declspec(property(get = get_is_data, put = set_is_data)) bool is_data;
// is_std -----------------------------------------------------
bool get_is_std(void)
{
return (FProperties & MASK_CANProp_EXTEND) == 0;
}
void set_is_std(const bool value)
{
if (value) {
FProperties = FProperties & (~MASK_CANProp_EXTEND);
} else {
FProperties = FProperties | MASK_CANProp_EXTEND;
}
}
__declspec(property(get = get_is_std, put = set_is_std)) bool is_std;
// is_err ----------------------------------------------------
bool get_is_err(void)
{
return (FProperties & MASK_CANProp_ERROR) != 0;
}
void set_is_err(const bool value)
{
if (value) {
FProperties = FProperties | MASK_CANProp_ERROR;
} else {
FProperties = FProperties & (~MASK_CANProp_ERROR);
}
}
__declspec(property(get = get_is_err, put = set_is_err)) bool is_err;
// load data bytes -------------------------------------------
void load_data(u8* a) {
for (u32 i = 0; i < 8; i++) {
FData[i] = *a++;
}
}
void set_data(const u8 d0, const u8 d1, const u8 d2, const u8 d3, const u8 d4, const u8 d5, const u8 d6, const u8 d7){
FData[0] = d0;
FData[1] = d1;
FData[2] = d2;
FData[3] = d3;
FData[4] = d4;
FData[5] = d5;
FData[6] = d6;
FData[7] = d7;
}
// initialize with standard identifier -----------------------
void init_w_std_id(s32 AId, s32 ADLC) {
FIdxChn = 0;
FIdentifier = AId;
FDLC = ADLC;
FReserved = 0;
FProperties = 0;
is_tx = false;
is_std = true;
is_data = true;
*(u64*)(&FData[0]) = 0;
FTimeUs = 0;
}
// initialize with extended identifier -----------------------
void init_w_ext_id(s32 AId, s32 ADLC) {
FIdxChn = 0;
FIdentifier = AId;
FDLC = ADLC;
FReserved = 0;
FProperties = 0;
is_tx = false;
is_std = false;
is_data = true;
*(u64*)(&FData[0]) = 0;
FTimeUs = 0;
}
} TCAN, *PCAN;