急! 菜鸟在线求助,请高手帮忙看段代码,有关串口数据接收及处理的。

jessiepan 2006-03-02 03:07:04
for(;;){
//Wait Until Data Recving
if(iPos==m_i485Buf){
Textout("485 Buffer is Empty, Wait\0");
while(iPos==m_i485Buf)
#if 1
tm_wkafter(timeout);
#else
tm_wkafter(10);
#endif
Textout("485 Buffer Has Some Data, Continue\0");
}

//---------------------------
#ifdef MAC_SDA /*2006-02-17*/
ch1 = (unsigned char)m_p485Buf[iPos];
switch(ch1){
case cmdRTS:
Textout("RECV RTS, Will SendBack RTR!\0");
Enable485Read(False);
memset(szTmp, 0, 8); szTmp[0] = cmdRTR;
uartWrite(port485, (char*)szTmp, 1);
sm_p(switchwrite_ok, SM_WAIT, 0);
Enable485Read(True);
bAllowData = True;
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
case cmdRTR:
Textout("RECV RTR!\0");
ev_send(tid_cmdProcessor, EV_Recv_RTR);
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
case cmdACK:
Textout("RECV ACK!\0");
ev_send(tid_cmdProcessor, EV_Recv_ACK);
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
case cmdNAK:
Textout("RECV NAK!\0");
ev_send(tid_cmdProcessor, EV_Recv_NAK);
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
case cmdData:
if(bAllowData)
break;
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
default:
Textout("FLAG Char is UnValid!(NOT A1/RTS/RTR/ACK/NAK) Skip it!!!\0");
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
}
#endif
//---------------------------

//Wait Until Data Head Recved
//if Special Time, Has No Data, Means 485Port Error, Skip All !!!
bDataOK = False;
while(!bDataOK){
if(iPos>m_i485Buf){
#ifdef MAC_SDA /*2006-02-17*/
if((BUFSIZE485+m_i485Buf-iPos)>=HEAD_LEN+1)
#else
if((BUFSIZE485+m_i485Buf-iPos)>=HEAD_LEN)
#endif
bDataOK = True;
}
else{
#ifdef MAC_SDA /*2006-02-17*/
if((m_i485Buf-iPos)>=HEAD_LEN+1)
#else
if((m_i485Buf-iPos)>=HEAD_LEN)
#endif
bDataOK = True;
}
if(!bDataOK){
#if 1
ev_receive(EV_485Busy, EV_NOWAIT|EV_ANY, 0, &events_r);
events_r = 0;
ev_receive(EV_485Busy, EV_WAIT|EV_ANY, timeout, &events_r);
if(events_r == 0){
Textout("Timeout When Recv Data Head, Skip All\0");
break;
}
#else
tm_wkafter(10);
#endif
}
}
if(!bDataOK){
iPos = m_i485Buf;
continue;
}
Textout("485 Buffer Has a Command Head, Check\0");

#ifdef HAS_TEXTOUT
sprintf(dbuf, "Command Head=0x%02X%02X%02X%02X\0",
m_p485Buf[iPos+0],
(iPos+1 >= BUFSIZE485)?m_p485Buf[iPos+1-BUFSIZE485]:m_p485Buf[iPos+1],
(iPos+2 >= BUFSIZE485)?m_p485Buf[iPos+2-BUFSIZE485]:m_p485Buf[iPos+2],
(iPos+3 >= BUFSIZE485)?m_p485Buf[iPos+3-BUFSIZE485]:m_p485Buf[iPos+3]);
Textout(dbuf);
#endif

//Make sure First Char is Valid Command FLAG
ch1 = (unsigned char)m_p485Buf[iPos];
if(ch1 != cmdData){
Textout("Fist Char is UnValid!!! Skip it!!!\0");
iPos++; if(iPos >= BUFSIZE485) iPos -= BUFSIZE485;
continue;
}
...全文
145 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jessiepan 2006-03-14
  • 打赏
  • 举报
回复
void MultiSendData(TSwitchCmd *pCmd)
{
int i;
TAddressTable *p = pAddressTable;
Bool bSendToManager = True;
unsigned short iLen = pCmd->size;

if(iLen <= sizeof(TSwitchCmd) || iLen > 255)
{
Textout("MultiSendData ERROR\0");
return;
}
pCmd->flag = flagDeviceIP;
pCmd->value.lVal = device_ip_addr;
sprintf(dbuf, "Count Of Address Table=0x%02X\0", localcfg.addr_count.lVal);
Textout(dbuf);

p = pAddressTable;
for(i=0;i<localcfg.addr_count.lVal;i++,p++){
if(p->ip.lVal != pCmd->value.lVal){
send_to(command_descriptor,
(char*)pCmd, pCmd->size,
p->ip.lVal, PORT_COMMAND);
}
}
}

TAddressTable 和 TSwitchCmd 的定义如下:
// Address Table Format
typedef struct{
union{
unsigned long lVal;
unsigned char szVal[4]; //BCD
}id;
union{
unsigned long lVal;
unsigned char szVal[4]; //192.168.000.001
}ip;
union{
unsigned long lVal;
unsigned char szVal[4]; //Device Type
}type;
}TAddressTable;

typedef struct{
unsigned char type;
unsigned char subtype;
unsigned char size;
unsigned char flag; //0xA5 || 0x5A

union{
unsigned long lVal;
unsigned char szVal[4];
}value;
}TSwitchCmd;

其实问题也很简单,在那段 FOR 循环里,如何保证p->ip.lVal不会重复?即在TAddressTable存储的IP地址,有可能出现重复的情况。 小弟实在太菜了!望各位高手见谅。
jessiepan 2006-03-04
  • 打赏
  • 举报
回复
不好意思!C语言没学好。哪位大哥能不能给个好的电子文档下载的网站啊?

我要好好学习,C语言。 先谢谢了。。

呵呵,good good study , day day up ~~~~~~~~
jessiepan 2006-03-02
  • 打赏
  • 举报
回复
老猫,不好意思啊!太急了,自己都没把问题想清楚。 这样吧,我一个一个的模块问,这个程序是基于psos平台下写的(先说明一下,问题跟OS平台应该也不大吧),是做485串口通信方面的处理的,数据的接收、发送及命令包的解析。。。

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <tm_common.h>
#include <tmlib/tmtypes.h>
#include <tm1/tsaUart.h>
#include <psos.h>
#include "app_protocol.h"
#include "app_config.h"

//Listen Port 485 : Recv Transfer/Control Command From C51, Save Data to Buffer
//Process TCP/IP : Write Back Transfer Command to Port 485

unsigned long switchwrite_ok = 0;
unsigned char m_p485Buf[BUFSIZE485+1];
static unsigned int m_i485Buf = 0; // 485 Input Buffer Pointer
unsigned long tid_485Listener;
unsigned long tid_485Processor;
extern unsigned long tid_Timer;
extern unsigned long tid_cmdProcessor; //This Task Will Write to 485Port
extern TSetupCmd localcfg;
extern int command_descriptor;

#if 1 //2005-12-31
extern unsigned long now_remote_ip;
#endif

//============================================================
void write_485_complete(Int instance, Int count, Pointer handle)
{
sm_v(switchwrite_ok);
}
void read_485_complete(Int instance, Int count, Pointer handle)
{
ev_send(tid_cmdProcessor, EV_485Busy);
ev_send(tid_485Processor, EV_485Busy);
m_i485Buf++;
if(m_i485Buf == BUFSIZE485) m_i485Buf = 0;
uartRead(port485, (char*)&m_p485Buf[m_i485Buf], 1);
}

//============================================================
void t_485Listener()
{
// if(switchwrite_ok!=0)
// ERROR_REPORT(AfxErr_DuplexCall);
sm_create("485W", 1, SM_PRIOR, &switchwrite_ok);
sm_p(switchwrite_ok, SM_WAIT, 0);

Enable485Read(True);
ERROR_REPORT(uartSetup(port485,
(tsaUartBaud_t)localcfg.baudrate.lVal,
read_485_complete,
write_485_complete));
m_i485Buf = 0;
uartRead(port485, (char*)&m_p485Buf[m_i485Buf], 1);
}

能帮忙给每个模块的功能加个详细的说明吗?语句后面加点注释? 我是新手菜鸟,看不大懂啊!。。。 唉。。
屋顶上的老猫 2006-03-02
  • 打赏
  • 举报
回复
上面程序485串口通信,你说的这些量应该是根据,通信协议的需求设置的,拿着协议看代码!

变量命名太混乱!
屋顶上的老猫 2006-03-02
  • 打赏
  • 举报
回复
中断方式通信?很简单,接受数据存入一个数组,然后你进行格式转换!

问题也不说个明白!

http://community.csdn.net/Expert/topic/4501/4501004.xml?temp=7.506961E-02

jessiepan 2006-03-02
  • 打赏
  • 举报
回复
我不明白的是,为什么在switch(ch1){ case } 的语句里,case 后面跟的 cmdRTS ,cmdRTR, cmdACK, cmdNAK, cmdData 全部都是在程序里没做任何定义的? 按道理case 后面跟的应该是个常量 吧?? 但程序编译又都能通过,是不是定义在其他的文件里了啊?!!

请高手看看啊! 能帮忙加点注释么?。。。求救啊!。。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧