移植到stm32f1,实现手动线赋码控制器功能
This commit is contained in:
@@ -64,7 +64,7 @@ typedef struct{
|
||||
}send_data_def;
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||
// 定义事件
|
||||
#define EVENT_RECV 0x1
|
||||
#define EVENT_SEND 0x2
|
||||
#define EVENT_TIMEOUT 0x4
|
||||
@@ -82,7 +82,7 @@ struct _protm_def{
|
||||
list_def *slaves;//protm_slave
|
||||
list_def *slaves_addr;//int
|
||||
list_def *send_data;//send_data_def
|
||||
int in_send;//<EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>״̬ʱΪ1
|
||||
int in_send;//在发送状态时为1
|
||||
uint8_t recv_cmd;
|
||||
uint8_t recv_src;
|
||||
|
||||
@@ -115,7 +115,7 @@ static void recv_irq(void *t,uint8_t d)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// <EFBFBD><EFBFBD>ʱһ֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 此时一帧数据已完成
|
||||
if(p->num_to_recv>0&&p->num_to_recv==arr_length(p->buff))
|
||||
{
|
||||
rt_event_send(p->event,EVENT_RECV);
|
||||
@@ -125,8 +125,8 @@ static void recv_irq(void *t,uint8_t d)
|
||||
|
||||
|
||||
/*
|
||||
* <EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ͨ<EFBFBD>ŵĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><EFBFBD>еģ<EFBFBD>һ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>ʼ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>
|
||||
* Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD>еģ<EFBFBD>Ӧ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᱻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* 与从机通信的串口是串行的,一个通信事务完成之后才能开始下一个通信
|
||||
* 协议层接收的通信事务是并行的,应用层来的通信任务会被放入队列
|
||||
*/
|
||||
|
||||
static void protm_send_next(void *t);
|
||||
@@ -173,13 +173,13 @@ static void protm_run(void *t)
|
||||
}
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
|
||||
// 发送下一个
|
||||
static void protm_send_next(void *t)
|
||||
{
|
||||
protm_def *p=t;
|
||||
rt_timer_stop(p->timer);
|
||||
list_remove(p->send_data,0);
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 如果发送列表中有数据,此时发送
|
||||
if (list_length(p->send_data)>0)
|
||||
{
|
||||
// DBG_LOG("protmcu:EVENT_SEND.");
|
||||
@@ -199,7 +199,7 @@ static void protm_send_timeout_cb(void *t)
|
||||
rt_event_send(p->event,EVENT_TIMEOUT);
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD>ʱ
|
||||
// 接收超时
|
||||
static void protm_send_timeout(void *t)
|
||||
{
|
||||
protm_def *p=t;
|
||||
@@ -213,7 +213,7 @@ static void protm_send_timeout(void *t)
|
||||
DBG_WARN("slave:%d retry timeout,remove the send data.",s->addr);
|
||||
list_remove(p->send_data,0);
|
||||
}
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 如果发送列表中有数据,此时发送
|
||||
if (list_length(p->send_data)>0)
|
||||
{
|
||||
// DBG_LOG("protmcu:EVENT_SEND.");
|
||||
@@ -230,7 +230,7 @@ static void protm_send_timeout(void *t)
|
||||
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||||
// 发送队列删除条目
|
||||
static int _list_send_data_del(void *t)
|
||||
{
|
||||
send_data_def *a=t;
|
||||
@@ -253,7 +253,7 @@ protm_def *protm_creat(uart_def *uart,int *addrs,int num)
|
||||
p->slaves=list_creat(sizeof(protm_slave),protm_slave_sub,protm_slave_del,0);
|
||||
p->slaves_addr=list_creat_int();
|
||||
p->send_data=list_creat(sizeof(send_data_def),0,_list_send_data_del,0);
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵȴ<EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 创建超时定时器,超过指定时间则不再等待从机返回
|
||||
p->timer=rt_timer_create("port_timer",protm_send_timeout_cb,p,
|
||||
rt_tick_from_millisecond(55),
|
||||
RT_TIMER_FLAG_ONE_SHOT|RT_TIMER_FLAG_SOFT_TIMER);
|
||||
@@ -269,7 +269,7 @@ protm_def *protm_creat(uart_def *uart,int *addrs,int num)
|
||||
}
|
||||
|
||||
|
||||
// <EFBFBD>õ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>Ĵӻ<EFBFBD>,<2C>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 得到指定地址的从机,找不到则添加
|
||||
protm_slave *protm_get_slave(protm_def *p,uint8_t addr)
|
||||
{
|
||||
protm_slave *r=0;
|
||||
@@ -290,7 +290,7 @@ protm_slave *protm_get_slave(protm_def *p,uint8_t addr)
|
||||
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дӻ<EFBFBD><EFBFBD><EFBFBD>ˮ<EFBFBD><EFBFBD>
|
||||
// 设置所有从机流水号
|
||||
void protm_set_no_all(protm_def *p,uint16_t no,list_def *cmd/*int*/)
|
||||
{
|
||||
for(int i=0;i<list_length(p->slaves);i++)
|
||||
@@ -303,7 +303,7 @@ void protm_set_no_all(protm_def *p,uint16_t no,list_def *cmd/*int*/)
|
||||
}
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD>ˮ<EFBFBD><EFBFBD>
|
||||
// 设置单个从机流水号
|
||||
void protm_set_no(protm_def *p,uint8_t addr,uint16_t no,list_def *cmd/*int*/)
|
||||
{
|
||||
protm_slave *s=protm_get_slave(p,addr);
|
||||
@@ -316,7 +316,7 @@ void protm_set_no(protm_def *p,uint8_t addr,uint16_t no,list_def *cmd/*int*/)
|
||||
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 解码
|
||||
array_def *protm_decode(protm_def *p,array_def *data)
|
||||
{
|
||||
array_def *r=arr_creat();
|
||||
@@ -334,7 +334,7 @@ array_def *protm_decode(protm_def *p,array_def *data)
|
||||
uint8_t crc=crc_crc8(arr_data(data),arr_length(data)-1);
|
||||
if(len!=arr_length(data))
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ
|
||||
// 如果长度不相等则产生了数据丢失
|
||||
DBG_WARN("recv data have lossed.");
|
||||
str_set(p->str_err,"recv data have lossed.");
|
||||
return r;
|
||||
@@ -343,7 +343,7 @@ array_def *protm_decode(protm_def *p,array_def *data)
|
||||
uint16_t h_no=protm_get_slave(p,src)->no;
|
||||
if(no!=h_no)
|
||||
{
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD>䷵<EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ˮ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ͬ
|
||||
// 发送一条指令等待其返回,此时流水号应相同
|
||||
//DBG_WARN("slave_addr=%d cmd_no error:h_no=%d,no=%d.",src,h_no,no);
|
||||
//str_set(p->str_err,"cmd no err.");
|
||||
//return r;
|
||||
@@ -356,7 +356,7 @@ array_def *protm_decode(protm_def *p,array_def *data)
|
||||
p->recv_cmd=arr_get(data,6);
|
||||
list_def *cmds=protm_get_slave(p,src)->cmds;
|
||||
if(list_contains(cmds,(int []){p->recv_cmd})==0){
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>鲻<EFBFBD><EFBFBD>
|
||||
// 命令号校验不对
|
||||
DBG_WARN("cmd check err.cmds=%s,recv_cmd=%d",tappend(list_string(cmds),0),p->recv_cmd);
|
||||
str_set(p->str_err,"cmd check err.");
|
||||
}
|
||||
@@ -365,7 +365,7 @@ array_def *protm_decode(protm_def *p,array_def *data)
|
||||
}
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 编码
|
||||
array_def *protm_encode(protm_def *p,uint8_t dst,uint8_t cmd,list_def *comp_cmd/*int*/,array_def *data)
|
||||
{
|
||||
array_def *t=arr_creat();
|
||||
@@ -378,9 +378,9 @@ array_def *protm_encode(protm_def *p,uint8_t dst,uint8_t cmd,list_def *comp_cmd/
|
||||
arr_append(t,'e');
|
||||
arr_append(t,len&0xff);
|
||||
arr_append(t,len>>8);
|
||||
arr_append(t,0);// Դ<EFBFBD><EFBFBD>ַ
|
||||
arr_append(t,dst);// Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
arr_append(t,cmd);// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
arr_append(t,0);// 源地址
|
||||
arr_append(t,dst);// 目标地址
|
||||
arr_append(t,cmd);// 命令码
|
||||
arr_append(t,slave->no&0xff);
|
||||
arr_append(t,slave->no>>8);
|
||||
arr_appends_from(t,data);
|
||||
@@ -388,7 +388,7 @@ array_def *protm_encode(protm_def *p,uint8_t dst,uint8_t cmd,list_def *comp_cmd/
|
||||
return t;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ȿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
||||
// 发送数据,发送前先开启超时定时器
|
||||
int protm_send(protm_def *p,send_data_def *d)
|
||||
{
|
||||
rt_tick_t tick=0;
|
||||
@@ -406,7 +406,7 @@ int protm_send(protm_def *p,send_data_def *d)
|
||||
}
|
||||
|
||||
|
||||
//// <EFBFBD>ۺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
//// 槽函数,发送数据到指定地址
|
||||
//void protm_send_call(protm_def *p,list_def *addrs/*int*/,uint8_t cmd,list_def *comp_cmd/*int*/,array_def *data)
|
||||
//{
|
||||
// param_check(p);
|
||||
@@ -425,7 +425,7 @@ int protm_send(protm_def *p,send_data_def *d)
|
||||
|
||||
|
||||
|
||||
// <EFBFBD>ۺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
// 槽函数,发送数据到指定地址
|
||||
void protm_send_call(protm_def *p,uint8_t addr,uint8_t cmd,list_def *comp_cmd/*int*/,array_def *data,int timeout_ms,int retry)
|
||||
{
|
||||
param_check(p);
|
||||
@@ -435,7 +435,7 @@ void protm_send_call(protm_def *p,uint8_t addr,uint8_t cmd,list_def *comp_cmd/*i
|
||||
t=protm_encode(p,addr,cmd,comp_cmd,data);
|
||||
//protm_send(p,t);
|
||||
//arr_delete(t);
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
|
||||
// 添加到发送队列,发送必须等到回应或超时才能发送下一个
|
||||
DBG_LOG("send to:%d",addr);
|
||||
send_data_def sd={0};
|
||||
sd.addr=addr;sd.data=t;
|
||||
@@ -456,7 +456,7 @@ void protm_send_call(protm_def *p,uint8_t addr,uint8_t cmd,list_def *comp_cmd/*i
|
||||
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʾ<EFBFBD>˵<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
||||
// 返回1表示此地址可以发送到这个端口
|
||||
int protm_contains(protm_def *p,uint8_t addr)
|
||||
{
|
||||
param_check(p);
|
||||
|
Reference in New Issue
Block a user