天天看點

arm闆子和單片機進行序列槽通訊

今天一個學長找我給我看看一個ARM闆子和序列槽通信的程式,後來百度了一下感覺挺多人發生這種情況。

單片機和計算機可以進行序列槽通信。

ARM闆子和計算機也可以序列槽通信。

但是用序列槽線把單片機和ARM連接配接一起之後卻不能通信了。

大家都知道應該是序列槽線的問題,需要進行交叉。

那麼如果不确定是不是序列槽線的問題下,其實可以直接用杜邦線把ARM闆子上的序列槽和單片機的闆子直接相連。

需要3個杜邦線、3個兩端都是針型狀的(一頭插進杜邦線,一頭插進母頭),連接配接分别為GND TXD RXD。

序列槽有分為公頭和母頭,5号為GND 2号為接受資料(RXD)  3号為發送資料(TXD)。

公頭:

    \ 1  2  3  4  5 /

      \  6 7 8 9   /

母頭:

     \  5  4  3  2 1  /

       \ 9  8  7 6  /

确定公頭和母頭的5号對連。

2号和3号則有兩種方法進行連接配接,

要麼2連接配接2

要麼3連接配接3

如果試一下一個不行,則可以換成另一種。

最後确實驗證可以通過。

當時測試的程式

單片機:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar flag, r;

uchar code table[] = "I get ";

sbit led1 = P2^3;

sbit led2 = P2^4;

sbit led3 = P2^5;

sbit led4 = P2^6;

void delay(uint x)

{

uint i, j;

for(i = x; i > 0; i--)

for(j = 110; j > 0; j--);

}

void init()

{

TMOD = 0x20;

TL1 = 0xfd;

TH1 = 0xfd;

TR1 = 1; //設定定時器1的工作方式、給定初值、并啟動。

SM0 = 0;//設定序列槽工作方式..

SM1 = 1;//為工作方式2..

REN = 1;//允許序列槽接收資料

ES = 1; //開啟序列槽中斷

EA = 1; //開啟總中斷.

}

void main()

{

uint i;

init();

while(1)

{

if(flag == 1)

{

ES = 0;

for(i = 0; i < 6; i++)

{

SBUF = table[i];

while(!TI);//等待資料是否發送完畢、

  //如果發送完畢TI = 1(引發中斷/但總中斷已關)

TI = 0;  

delay(100);

}

SBUF = r;

while(!TI);

TI = 0;

flag = 0; 

ES = 1;

}

}

}

void ser()interrupt 4

{

led4 = 0;

led1 = led2 = led3 = 1;

RI = 0; //關閉接收中斷标志位..

flag = 1; //标志已經接收到資料

r = SBUF; //把資料存放r變量中(8位)

if(r == '3')

{

led1 = 0;

led2 = 0;

led3 = 0;

}

if(r == '2')

{

led1 = 0;

led2 = 0;

}

if(r == '1')

{

led1 = 0;

}

}

ARM闆上:

#include<stdio.h>

#include<stdlib.h>

#include<fcntl.h>

#include<errno.h>

#include<termios.h>

#include<sys/types.h>

#include<sys/unistd.h>

#include<unistd.h>

#include<string.h>

int main()

{

int fd;

struct termios new_cfg, old_cfg;

char buff[20];

char a;

char *name = "/dev/s3c2410_serial0";

fd = open(name, O_RDWR|O_NDELAY);

if(fd < 0)

{

perror("open");

exit(-1);

}

else

{

printf("open s3c2440_serial0 success\n");

}

if(tcgetattr(fd, &old_cfg) != 0)

{

perror("tcgetattr");

exit(-1);

}

new_cfg = old_cfg;

cfmakeraw(&new_cfg);

new_cfg.c_cflag &= ~CSIZE;

cfsetispeed(&new_cfg, B9600);

new_cfg.c_cflag |= CS8;

new_cfg.c_cflag &= ~PARENB;

new_cfg.c_cflag &= ~CSTOPB;

tcflush(fd, TCIFLUSH);

tcsetattr(fd, TCSANOW, &new_cfg);

a = '3';

do

{

printf("Input some words(enter 'quit' to exit):");

// memset(buff, 0, 20);

buff[0] = a;

a--;

if(a == '0')

{

a = '3';

}

buff[1] = '\0';

write(fd, buff, strlen(buff));

sleep(1);

}while(strncmp(buff, "quit", 4));

close(fd);

return 0;

}

繼續閱讀