作者 主題: 關於使用uart  (閱讀 7022 次)

0 會員 與 1 訪客 正在閱讀本文。

adddream

  • 可愛的小學生
  • *
  • 文章數: 8
    • 檢視個人資料
關於使用uart
« 於: 2006-09-17 03:25 »
小弟使用的版子為 XScale PXA255上頭有兩個UART port
小弟想要使用這兩個uart port完成我想要的工作 但就是動不起來希望各位大大能幫幫小弟
小弟的接線方式為板子uart1<------------------>pc uart1
                板子uart2<------------------>pc uart2
如上所示為小弟的接線情形
其中uart1為使用minicom進行pc與版子的通訊
    uart2為採用串列埠傳輸資料(pc傳送,板子接收)
程式碼如下
傳送端#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <string.h>

typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned long U32;

void setTermios(struct termios *pNewtio, U16 uBaudRate)
{
   bzero(pNewtio, sizeof(struct termios));
   pNewtio->c_cflag=uBaudRate | CS8 | CREAD | CLOCAL; //控制模式標誌CREAD允許輸入CLOCAL本地調節CS8數據位碼
   pNewtio->c_iflag=IGNPAR; //輸入模式標誌IGNPAR忽略奇偶校驗出錯的字節
   pNewtio->c_oflag=0; //輸出模式標誌0表示原始輸出
   pNewtio->c_lflag=0; //本地模式標誌0表示原始輸入
   pNewtio->c_cc[VINTR]=0;//中斷字符
   pNewtio->c_cc[VQUIT]=0;//退出字符
   pNewtio->c_cc[VERASE]=0;//刪除字符
   pNewtio->c_cc[VKILL]=0;
   pNewtio->c_cc[VEOF]=4;//文件結束字符
   pNewtio->c_cc[VTIME]=5;//設定字符輸入間隔時間的計時器
   pNewtio->c_cc[VMIN]=0; //滿足函數的最少字節數
   pNewtio->c_cc[VSWTC]=0;
   pNewtio->c_cc[VSTART]=0;
   pNewtio->c_cc[VSTOP]=0;
   pNewtio->c_cc[VSUSP]=0;
   pNewtio->c_cc[VEOL]=0;
   pNewtio->c_cc[VREPRINT]=0;
   pNewtio->c_cc[VDISCARD]=0;
   pNewtio->c_cc[VWERASE]=0;
   pNewtio->c_cc[VLNEXT]=0;
   pNewtio->c_cc[VEOL2]=0;
}
int main(int argc, char **argv)
{
   int fd;
   int nCount,nTotal,i;
   struct termios oldtio,newtio;
   char *dev="/dev/ttyS1";
   if((argc!=3) || (sscanf(argv[1], "%d", &nTotal) !=1))
   {
      printf("Usage: COMsend count data!\n");
      return -1;
   }
   if((fd=open(dev,O_RDWR | O_NOCTTY))<0) /*設定串口通訊方式*/
   {
      printf("Can't Open Serial Port!\n");
      return -1;
   }
   tcgetattr(fd,&oldtio);//保存原有的串口設置,以便恢復調用前狀態
   setTermios(&newtio,B57600);
   tcflush(fd,TCIFLUSH);//清空串口暫存
   tcsetattr(fd,TCSANOW,&newtio);//設置新的社定值
   for(i=0;i<nTotal;i++)
   {
      nCount=write(fd,argv[2],strlen(argv[2]));
      printf("send data OK! count=%d\n",123);

   }
   tcsetattr(fd,TCSANOW,&oldtio);
   close(fd);
   return 0;
}


接收端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <string.h>

typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned long U32;

void setTermios(struct termios *pNewtio, U16 uBaudRate)
{
   bzero(pNewtio, sizeof(struct termios));
   pNewtio->c_cflag=uBaudRate | CS8 | CREAD | CLOCAL; //控制模式標誌CREAD允許輸入CLOCAL本地調節CS8數據位碼
   pNewtio->c_iflag=IGNPAR; //輸入模式標誌IGNPAR忽略奇偶校驗出錯的字節
   pNewtio->c_oflag=0; //輸出模式標誌0表示原始輸出
   pNewtio->c_lflag=0; //本地模式標誌0表示原始輸入
   pNewtio->c_cc[VINTR]=0;//中斷字符
   pNewtio->c_cc[VQUIT]=0;//退出字符
   pNewtio->c_cc[VERASE]=0;//刪除字符
   pNewtio->c_cc[VKILL]=0;
   pNewtio->c_cc[VEOF]=4;//文件結束字符
   pNewtio->c_cc[VTIME]=5;//設定字符輸入間隔時間的計時器
   pNewtio->c_cc[VMIN]=0; //滿足函數的最少字節數
   pNewtio->c_cc[VSWTC]=0;
   pNewtio->c_cc[VSTART]=0;
   pNewtio->c_cc[VSTOP]=0;
   pNewtio->c_cc[VSUSP]=0;
   pNewtio->c_cc[VEOL]=0;
   pNewtio->c_cc[VREPRINT]=0;
   pNewtio->c_cc[VDISCARD]=0;
   pNewtio->c_cc[VWERASE]=0;
   pNewtio->c_cc[VLNEXT]=0;
   pNewtio->c_cc[VEOL2]=0;
}
#define BUFSIZE 512
int main(int argc, char **argv)
{
   int fd;
   int nread;
   char buff[BUFSIZE];
   struct termios oldtio,newtio;
   struct timeval tv;
   char *dev="/dev/ttyS1";
   fd_set rfds;
   
   if((fd=open(dev,O_RDWR | O_NOCTTY))<0) /*設定串口通訊方式*/
   {
      printf("Can't Open Serial Port!\n");
      return -1;
   }
   tcgetattr(fd,&oldtio);//保存原有的串口設置,以便恢復調用前狀態
   setTermios(&newtio,B57600);
   tcflush(fd,TCIFLUSH);//清空串口暫存
   tcsetattr(fd,TCSANOW,&newtio);//設置新的社定值
   
   tv.tv_sec=30;
   tv.tv_usec=0;
   while(1)
   {
      FD_ZERO(&rfds);
      FD_SET(fd,&rfds);
      if(select(1+fd,&rfds,NULL,NULL,&tv)>0)
      {
         if(FD_ISSET(fd,&rfds))
            {
               nread=read(fd, buff, BUFSIZE);
               printf("readlength=%d\n",nread);
               buff[nread]='\0';
               printf("%s\n",buff);
            }
      }
   }
   tcsetattr(fd,TCSANOW,&oldtio);
   close(fd);
}

謝謝