打印

看一段关于通讯的程序

[复制链接]
2122|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nanfang8|  楼主 | 2008-1-23 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 void    PcSerialSendPrg(UINT16 Cmd,UINT8 Len,UINT8 *Buf)
 {
    UINT8 i;
    //在上次发送未完成前等待发送结束
       ComTransFrame.SOF=SLAVE_ANSWER_HEAD;
    ComTransFrame.AddrH=MachineType;
    ComTransFrame.AddrL=MachineSelfNum;
    ComTransFrame.CmdH=Cmd>>8;
    ComTransFrame.CmdL=Cmd;
    //ComTransFrame.LenthH=Len>>8;
    //ComTransFrame.LenthL=(UINT8)Len;
    ComTransFrame.LenthH=0;
    ComTransFrame.LenthL=Len;
    for (i=0;i<Len;i++)
    {
        ComTransFrame.DBuf=Buf;
    }
    ComTransFrame.CRC=0;
    
#if  QuerySerialSend
    
    ES=0;RI=0;TI=0;
    for (i=0;i<Len+7;i++)
    {
        SBUF=*((UINT8 *)&ComTransFrame+i);
        ComTransFrame.CRC += *((UINT8 *)&ComTransFrame+i);
        while(!TI);TI=0;
    }
    SBUF=ComTransFrame.CRC;
    while(!TI);TI=0;
#endif
    UartSendDataNum=0;
    ES=1;
    EA=1;
 }

相关帖子

沙发
nanfang8|  楼主 | 2008-1-23 16:36 | 只看该作者

仍然

这一段是如何发送的我没有看懂,请教各位帮忙解释一下
*((UINT8 *)&ComTransFrame+i);
*((UINT8 *)这是什么用法
for (i=0;i<Len+7;i++)  这个为什么LEN后面加7
有看懂这一段程序的 吗

使用特权

评论回复
板凳
nanfang8|  楼主 | 2008-1-23 16:41 | 只看该作者

gg

这里用的是结构语法
那结构又是如何发送数据的 呢

使用特权

评论回复
地板
etual| | 2008-1-23 16:49 | 只看该作者

随便说说

*((UINT8 *)  是强制数据转换,这里 ComTransFrame 没有给出定义
应该是一个结构体变量吧.
一般来说,这个结构是用来强制访问结构体或者数组里面的一个
8位的元素(因为用 UINT8 强制指定了)

结构体可以通过指针传递,你的例子里面貌似是全局变量吧
随便想用就用.....

使用特权

评论回复
5
windymeng| | 2008-1-23 18:44 | 只看该作者

不知道`

看了下```感觉就是大一时候学的那C语言的程序```但是你那程序感觉又不是象那么回事

使用特权

评论回复
6
ldy216| | 2008-1-24 10:59 | 只看该作者

程序结构太差

    这是一个用双字节命令发送指定长字符串的一协议帧的例子
    只是程序结构太差,在发送数据期间,无法做其他事,如果USB来数据来怎么办,每隔10毫秒要做的事来了怎么办,其他中断来了怎么办
    这种程序应该是目前广大工程师的弊病。
    如果大家要一个好的例子,我可以发一个过来:

void  Init_UART0(void)
{
  SCON0=0x010;               //RECIEVE ENABLE
  PCON=0x080;                //SMOD=1
                             //;定时器0=方式1,定时器1=方式2(自动重装入8位计数器,波特率发生器)
  TMOD=0x21;   //TIMER0 MODE=1,  TIMER1 MODE=2, 8 BIT COUNTER
  TCON=0x00;
  UART0_SetBaud(UART0_BAUD);

  TI0=0;   //CLEAR   FLAG
  RI0=0;   //CLEAR   FLAG
  ET0=0;   //CLOSE   TIMER0 INT
  ET1=0;   //CLOSE   TIMER1 INT
  TR0=0;   //CLOSE   TIMER0
  TR1=1;   //OPEN    TIMER1
  ES0=1;   //OPEN    COMMINT
}

//设置波特率,用于动态波特率自适应的
//-------------------------------------------------------------------------------
void UART0_SetBaud(unsigned char BaudIndex)
{
  // at sysclk=12Mhz
  switch (BaudIndex)
  {
  case 0:
    TH1=0x98;    //1200BIT/S,at  SYSCLK/48
    CKCON=(CKCON & 0xFC)|0x02;
    break;
  case 1:
    TH1=0x30;   //2400BIT/S,at  SYSCLK/12
    CKCON=CKCON & 0xFC;
    break;
  case 2:
    TH1=0x98;   //4800BIT/S,at  SYSCLK/12
    CKCON=CKCON & 0xFC;
    break;
  case 3:
    TH1=0xCC;   //9600BIT/S,at  SYSCLK/12
    CKCON=CKCON & 0xFC;
    break;
  case 4:
    TH1=0xE6;   //19200BIT/S,at  SYSCLK/12
    CKCON=CKCON & 0xFC;
    break;
  case 5:
    TH1=0x98;   //28800BIT/S,at  SYSCLK/4
    CKCON=(CKCON & 0xFC) | 0x01;
    break;
  case 6:
    TH1=0xCC;   //57600BIT/S,at  SYSCLK/4
    CKCON=(CKCON & 0xFC) | 0x01;
    break;
  case 7:
    TH1=0xE6;   //115200BIT/S,at SYSCLK/4
    CKCON=(CKCON & 0xFC) | 0x01;
    break;
  default:
    TH1=0xCC;   //9600BIT/s
    break;
  }
}

//中断函数
void UART0_ISR(void) interrupt VECTOR_UART0
{
  if (RI0) UART0_Read();
  if (TI0) UART0_Write();
}

//中断读取,先入缓冲,再作具体处理,处理时间不要太长,
//以便接收下一个字节,如果太长,置标志在主程序处理。
void UART0_Read(void)
{
    
  RI0=0;
  UART0_RBUF_Index=(UART0_RBUF_Index+1) % UART0_RBUF_Size;
  UART0_RBUF[UART0_RBUF_Index]=SBUF0;
  if(UART0_RBUF_Count<UART0_RBUF_Size) UART0_RBUF_Count++;
  //to control

  UART0_Received=1;
  IntEvent_On=1;
}
//中断发送
void UART0_Write(void)
{
  TI0=0;
  UART0_Write_Char_On=0;
  if(!UART0_Send_On)  return; 
  if (UART0_TBUF_Count>0)
  {
    UART0_TBUF_Count-=1;
    SBUF0=UART0_TBUF[ ((UART0_TBUF_Index-UART0_TBUF_Count+UART0_TBUF_Size)%UART0_TBUF_Size)  ];
    UART0_Write_Char_On=1;  //after update sbuf0
  }
  else 
  {
    UART0_Send_On=0;
  }
}

void UART0_WaitSend(void)
{
  while (UART0_Send_On);
}

//发射一个字节,不用等待,后台发送
void UART0_Send_Char(unsigned char c)
{

#ifdef MD5_Encode_On
  if (MD5_OK_On)
  {
    c ^= MD5_Encode_Char;
  }
#endif

  while(UART0_TBUF_Count>=UART0_TBUF_Size);
  UART0_Send_On=0;
  UART0_TBUF_Index=(UART0_TBUF_Index+1) % UART0_TBUF_Size;
  UART0_TBUF[UART0_TBUF_Index]=c;
  UART0_TBUF_Count++;
  UART0_Send_On=1;
  if(!UART0_Write_Char_On) TI0=1;
}

//发送数据包
void UART0_Send_String(unsigned char *s,unsigned char len)
{
  unsigned char i;
  for (i=0;i<len;i++)
    UART0_Send_Char (s);
}

通过以上函数加上适当定义即可以很方便地完成串行通信。且不影响主程序哟!


   QQ:184324486
   手机:13527614127

使用特权

评论回复
7
nanfang8|  楼主 | 2008-2-8 16:03 | 只看该作者

ddd

有点看不懂
这是怎么个意思

使用特权

评论回复
8
xwj| | 2008-2-8 17:40 | 只看该作者

同意6楼: 程序结构太差

使用特权

评论回复
9
暮远| | 2008-2-15 13:16 | 只看该作者

len+7

len只是data长度,7是头部(frame header)的长度

使用特权

评论回复
10
nanfang8|  楼主 | 2008-3-30 22:24 | 只看该作者

ed

发送数据是如何发送的啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

172

主题

406

帖子

0

粉丝