jlqhd
驱动牛犊
驱动牛犊
  • 注册日期2005-06-10
  • 最后登录2005-07-18
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1340回复:1

串口设备链接的问题(附源代码和反汇编代码)

楼主#
更多 发布于:2005-07-14 16:19
在上位机上作一个与一固定外设的通信程序。通过串口通信模拟程序测试,该程序收发数据正常。但就是不能与该外设通信。外设有一简单的时序要求:通过CTS handshake信号控制数据收发。CTS为Low时可通过RX接收上位机的命令。接收后100ms上开始通过TX向上位机发送数据。

我程序中的做法是:

监听CTS管脚状态
 if(CTS==1)
     发送命令
   任务等待100ms
for(;;){

     接收数据
   将接收到的数据输出到指定文件
}

还有一个可能就是大端小端的问题。我使用的上位机是小端的,这是否会有影响。比如在我程序中发送命令0x52 0x04,传输时会改变成0x04 0x52或别的形式么
还请高人指教,不胜感谢!
jlqhd
驱动牛犊
驱动牛犊
  • 注册日期2005-06-10
  • 最后登录2005-07-18
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-15 10:18
如下是我写的源代码,附件中是反编译的汇编代码(有两段,一段是全部的,一段是从执行readRFID开始的)

头文件test.h

#ifdef DEBUG
#include <util/tmonitor.h>
#endif

#include <basic.h>
#include <sys/consio.h>
#include <tk/util.h>
#include <btron/tkcall.h>
#include <device/rs.h>
#include <device/serialio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/svc/ifconsio.h>
#include <machine.h>
#include <signal.h>

struct watermelon{
  int dd,asiz,er ;
  RsMode rsmode;
  RsFlow rsflow;
  RsStat rsstat;
  FILE *fp;
  unsigned char sbuf[1024],rbuf[2048];
};
typedef struct watermelon * watermelon_p;

test.c
#include "test.h"

#ifdef DEBUG
#include <util/tmonitor.h>
#endif


int rsInit(watermelon_p wp){

  ER er;

  /*clear struct*/
  memset(&(wp->rsmode),0,sizeof(wp->rsmode));
  memset(&(wp->rsflow),0,sizeof(wp->rsflow));
  memset(&(wp->rsstat),0,sizeof(wp->rsstat));

  /*set rsmode*/
  wp->rsmode.parity=0;
  wp->rsmode.datalen=3;
  wp->rsmode.stopbits=0;
  wp->rsmode.baud=38400;
  er=tk_swri_dev(wp->dd,DN_RSMODE,&(wp->rsmode),sizeof(wp->rsmode),&(wp->asiz));
  if(er<0) return wp->er = -104;

  /*set rsflow*/
  wp->rsflow.csflow = 1; wp->rsflow.rxflow = 1;/*not set XON,XOFF yet*/
  er=tk_swri_dev(wp->dd,DN_RSFLOW,&(wp->rsflow),sizeof(wp->rsflow),&(wp->asiz));
  if(er<0) return wp->er = -105;

  return 0;
}

int rsOpen(watermelon_p wp){
  wp->dd = tk_opn_dev("rsa",TD_UPDATE);
  if(wp->dd<0) return wp->er = -106;
  return 0;
}

int readRFID(watermelon_p wp){

  ER er;
  wp->sbuf[0]=0x52;
  wp->sbuf[1]=0x04;

  er = serial_ctl(0,-DN_RSSTAT,(UW*)&(wp->rsstat));
    if(er<0){wp->er = -112;}

    if(wp->rsstat.CS == 1){
      er = serial_out(0,wp->sbuf,2,&(wp->asiz),-1);
      if(er<0){wp->er = -110;}
    }

    tk_slp_tsk(100);

  for(;;){
      
    //tk_slp_tsk(100);

      er = serial_in(0,wp->rbuf,1,&(wp->asiz),-1);
      if(er<0){wp->er = -111;}
    
      er = fprintf(wp->fp,"%s",wp->rbuf);
      
      if(er<0){wp->er = -113;}
      fflush(wp->fp);
    
  }
  return 0;
}

EXPORT W main(INT ac, char *av[]){
#ifdef DEBUG
  tm_monitor();
#endif

  int er;
  watermelon_p wp;

  tk_slp_tsk(2000);

  if((wp = malloc(sizeof(struct watermelon)))==NULL){
    wp->er = -100;
    goto E;
  }

  wp->fp = fopen("/SYS/file","a+");
  if(wp->fp==NULL){
    wp->er = -107;
    goto E;
  }

  er = rsOpen(wp);
  if(er<0)goto E;

  er = rsInit(wp);
  if(er<0)goto E;

  er=readRFID(wp);
  if(er<0)goto E;

  er = tk_cls_dev(wp->dd,0);
  if(er<0){wp->er = -120;goto E;}

  er= fclose(wp->fp);
  if(er<0);{wp->er = -121; goto E;}

  return 0;
 E:
  fprintf(wp->fp,"error:%d\n",wp->er);
  return 0;
}  

汇编代码在附件中
附件名称/大小 下载次数 最后更新
tty.rar (7KB)  19
游客

返回顶部