小弟使用的版子為 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);
}
謝謝