打印

为什么这段代码最后一个字节发送不出去呢??

[复制链接]
2361|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaosuowen|  楼主 | 2010-11-2 23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void DaBao(char Leixing,unsigned char Data)
{
   Data_Bao[0]=0xFF;
   Data_Bao[1]=0xAA;     //包头
   Data_Bao[2]=0xA1;     //项目号
   Data_Bao[3]=0x11;     //车号和线路号
   Data_Bao[4]=Leixing;  //区别是杆还是红外传感器
   Data_Bao[5]=Data;     //将传感器的状态存入数据包中
}

void Send_Bao(unsigned char *Data)
{
  char j=0;
  for(j;j<6;j++)
  {
   Send_Char(*Data);     //发送一个字节数据
   Data++;
//指针向后移
   
  }
}

void Send_Char(unsigned char Char)
{
RS485_T;              //设置RS485为发送状态
while(!TI);           //检测上一个字节是否发送完毕,及是否为发送下一字节做好准备
TI=0;                 //清楚发送中断标志位
SBUF=Char;            //发送数据
}

其中 Data_Bao[6]是一个全局变量,上位机应该接收到FFAAA11101xx的数据,但是
调试的时候接收到的数据时FFAAA11101FF。。Dabao函数中的Data是全局变量,是传感器收集到的数据。。希望高人能给予解答。。再次谢过了

相关帖子

沙发
idterminator| | 2010-11-3 00:30 | 只看该作者
Data_Bao[5]=Data;   
随便赋个值,看看接收到什么,

使用特权

评论回复
板凳
acute1110| | 2010-11-3 09:07 | 只看该作者
程序没有看出什么问题,最好能单步debug一下程序,看看Data,及*data等变量的变化情况。

使用特权

评论回复
地板
diweo| | 2010-11-3 15:56 | 只看该作者
void Send_Bao(unsigned char *Data)
{
  char j=0;
  for(j;j<6;j++)      --------------->  这里应该j<7吧  <-----------------------
  {
   Send_Char(*Data);     //发送一个字节数据
   Data++;
//指针向后移
   
  }
}

使用特权

评论回复
5
dl_shuang| | 2010-11-3 16:20 | 只看该作者
看看你的程序在发完最后一个数据后,是否未等待发送完直接将RS485置为接收态?

使用特权

评论回复
6
一级菜鸟| | 2010-11-3 16:57 | 只看该作者
改成这样:

void Send_Char(unsigned char Char)
{
RS485_T;              //设置RS485为发送状态
SBUF=Char;            //发送数据
while(!TI);           //检测上一个字节是否发送完毕,及是否为发送下一字节做好准备
TI=0;                 //清楚发送中断标志位
}

优点是不会在最后一个字节未发送出去的时候,在代码的其他地方关闭485发射使能,保证全部数据被发送。
缺点是你必须等数据发送完毕之后才能进行后面的工作。

既要不死等串口发送完毕,又要保证数据发送正常,那么用中断。

使用特权

评论回复
7
mmax| | 2010-11-3 21:33 | 只看该作者
void Send_Bao(unsigned char *Data)
{
  char j=0;
  for(j;j<6;j++)
  {
   Send_Char(*Data);  
   Data++;   
  }

    while(!TI);           
    //最后一个字符发出后,在此处等待发完再退出Send_Bao函数。

}

使用特权

评论回复
8
xiaosuowen|  楼主 | 2010-11-3 22:07 | 只看该作者
多谢各位的回答啊。。多谢多谢,由于上课所以没有及时上来看看。我现在就一个一个的试去,完了把结果发上来

使用特权

评论回复
9
xiaosuowen|  楼主 | 2010-11-3 22:12 | 只看该作者
4# diweo 这样作了以后,钱6个字节是发送正确了,但是最后会随机的多出来一个字节,而且固定的是FF

使用特权

评论回复
10
xiaosuowen|  楼主 | 2010-11-3 22:23 | 只看该作者
5# dl_shuang 牛人。。。我就是害怕上位机传来的数据包,所以while(1)里不停地设置485为接受状态,所以最后一个字节就发布出去了。。。谢谢你啊

使用特权

评论回复
11
xiaosuowen|  楼主 | 2010-11-3 22:26 | 只看该作者
6# 一级菜鸟 我理解了,准备就这么作。。谢谢你们啊

使用特权

评论回复
12
xiaosuowen|  楼主 | 2010-11-4 11:43 | 只看该作者
现在问题又出现了。。系统复位以后第一次发送,第二个字节AA会漏发,真是头痛

使用特权

评论回复
13
7120223| | 2010-11-4 14:47 | 只看该作者
本帖最后由 7120223 于 2010-11-4 14:50 编辑

为什么不用中断发送? 还有一帧数据发送在开始数据头处就开485 ,在这帧数据发完后在延时一小段时间关485.干嘛要用指针移位发里,呵呵 用数组发不是挺简单的
....
T_Rs485_on();
SBUF = Data_Bao[0];
....
...进中断....
if(TI==1)
{
   TI = 0;
   if(TX_Num<6)
   {
        SBUF = Data_Bao[TX_Num];
        TX_Num++;
    }
   else
  {
        TX_Num = 1;
        T_Rs485_off();
}
}

使用特权

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

本版积分规则

1

主题

160

帖子

1

粉丝