(C)我已經寫好連結電腦,誰可以教我寫rs-232讀資料跟送資料
[i=s] 本帖最後由 風箏惡魔 於 2009-5-2 11:20 編輯 [/i]這是關於ip-link 1220 晶片是8051,
我目前就寫到這樣可以連結,但是不知道怎麼讀和送資料
請各位前輩幫幫忙,幫我看一下,我用的是C>"<
#include <stdio.h>
#include <stdlib.h>
#define ControlHeader 0
#define LinkQualityIndicator 1
#define DestinationAddress 2
#define PayloadLength 4
#define Payload 5
int Checksum;
FILE *ZigBee;
unsigned char sBuf[104], rBuf[104];
const unsigned char CRequest = 128;
const unsigned char CResponse = 192;
const unsigned char DRequest = 160;
const unsigned char DResponse = 224;
int ZigBeeInit(int comNum, int channel, int isClient, unsigned short netNodeID, unsigned short netID)
{
char sCOM[5] = "COM3";
char *master = "master", *client = "client";
char *nodeType;
unsigned char xorSum;
int sequence, i, n;
sCOM[3] = comNum + '0'; sCOM[4] = 0;
if((ZigBee = fopen(sCOM, "r+")) == NULL){
fprintf(stderr, "Can't open %s !\n", sCOM);
exit(1);
}
sequence = 1;
sBuf[ControlHeader] = CRequest + sequence%16;
sBuf[LinkQualityIndicator] = 0;
sBuf[DestinationAddress] = 0x00;
sBuf[DestinationAddress+1] = 0x00;
sBuf[PayloadLength] = 0x03;
sBuf[Payload] = 0x8f;
//sBuf[Payload+1] = 0x70;
//sBuf[Payload+2] = 0;
Checksum = Payload + PayloadLength;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
if(rBuf[Payload+1] == 0){
fprintf(stdout,"ZigBee sending power is set to max!\n");
}
sBuf[Payload+1] = 0x72;
sBuf[Payload+2] = (unsigned char) channel;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
if(rBuf[Payload+1] == 0){
fprintf(stdout,"ZigBee RF channel is set to %d!\n", channel);
}
sBuf[Payload+1] = 0x96;
sBuf[Payload+2] = (unsigned char) (isClient==0)?0:1;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
if(rBuf[Payload+1] == 0){
nodeType = (isClient==0)?master:client;
fprintf(stdout,"ZigBee is set to %s!\n", nodeType);
}
sBuf[Payload+1] = 0x99;
sBuf[Payload+2] = (unsigned char) 1;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0x9A;
sBuf[Payload+2] = (unsigned char) 1;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0x9e;
sBuf[Payload+2] = (unsigned char) 0;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0x9f;
sBuf[Payload+2] = (unsigned char) 0xff;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xa0;
sBuf[Payload+2] = (unsigned char) 0x62;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xb4;
sBuf[Payload+2] = (unsigned char) 1;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xb5;
sBuf[Payload+2] = (unsigned char) 1;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xb7;
sBuf[Payload+2] = (unsigned char) 0;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xbc;
sBuf[Payload+2] = (unsigned char) netNodeID >> 8;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xbd;
sBuf[Payload+2] = (unsigned char) (netNodeID << 8)>> 8;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xbe;
sBuf[Payload+2] = (unsigned char) netID >> 8;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xbf;
sBuf[Payload+2] = (unsigned char) (netID << 8)>> 8;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xc0;
sBuf[Payload+2] = (unsigned char) netNodeID >> 8;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
sBuf[Payload+1] = 0xc1;
sBuf[Payload+2] = (unsigned char) (netNodeID << 8)>> 8;
for(xorSum = sBuf[0], i=1; i<Checksum; i++) xorSum ^=sBuf[i];
sBuf[Checksum] = xorSum;
if((n = fwrite(sBuf, Checksum + 1, Checksum + 1, ZigBee))!=(Checksum+1)){
fprintf(stderr, "Can't write to Zigbee\n");
exit(2);
}
if((n = fread(rBuf, 104, 104, ZigBee))==0){
fprintf(stderr, "Can't read from ZigBee!");
exit(3);
}
}
//接收資料
void accecpter() {
int n, i;
while((n = fread(rBuf,104,104,ZigBee))==0);
for(i=0;i<104;i++)fprintf(stdout,"%2x\t",rBuf[i]);fprintf(stdout,"\n");
}
int main(int argc, char *argv[])
{
ZigBeeInit(4,1,1,1,1);
system("PAUSE");
return 0;
} 大大的用法比較偏向純C
不知道大大有沒有試用過
CreateFile的方式來開啟COM port呢
記得CreateFile之後只要對COM port
使用FileRead及FileWrite就可以讀寫了
剩下的就是事件流程的控制 [i=s] 本帖最後由 Andy95 於 2009-5-4 13:48 編輯 [/i]
Send Data
int seqNo = 0;
int sendTo(FILE *ZigBee, unsigned short NodeID, char *theData)
{
int i, retCode;
sBuf[ControlHeader] = 0xA0+(seqNo++)%16;
sBuf[LQI] = 0xFF;
sBuf[DestinationAddress] = NodeID>>8; sBuf[DestinationAddress+1] = NodeID%0x10000;
for(i=0; i<=97; i++) if(theData[i] == 0) break;
sBuf[PayloadLength] = i;
for(i=0; i<=sBuf[PayloadLength]-1; i++)sBuf[Payload+i] = theData[i];
int XORChecksum = 0;
for(i=0; i<sBuf[sBuf[PayloadLength]]; i++) XORChecksum ^= sBuf[i];
sBuf[sBuf[PayloadLength]+5] = XORChecksum;
(sBuf, 1, sBuf[PayloadLength]+5, ZigBee);
if(fread(rBuf,1,8,ZigBee) == 0){
fprintf(stderr, "read from zigbee error!\n");
exit(1);
}
return (retCode = rBuf[5]*(2<<8) + rBuf[6]);
}
==================================================
Received Data
char* receive(FILE *ZigBee, char *theData)
{
int n, i;
while((n = fread(theData,1,104,ZigBee))==0);
for(i=0;i<104;i++)fprintf(stdout,"%2x\t",*(theData+i));fprintf(stdout,"\n");
return theData;
}
....
......
int main(int argc, char *argv[])
{
char theData[200];
ZigBeeInit(5,0,1,atoi(argv[1]),1);
送端送資料~~
if(sendTo(ZigBee, 0xffff, "12345") == 0){
fprintf(stdout, "I have sent it\n");
}
=========
收端收資料~~
fprintf(stdout, "Now ready to receive!\n");
if(theData == receive(ZigBee, theData)){
fprintf(stdout, "I have receice!\n");
}
system("PAUSE");
return 0;
}
各位大大~我寫這樣有錯嗎?
為什麼還是收不到資料>"<
我是用IP-LINK1220 zigbee~無線傳輸資料 這個部分我是建議你先做硬體上的測試看看是否正常
你可以先使用超級終端機測試看看硬體是否正確
再考慮程式碼的問題 [i=s] 本帖最後由 cmdunlop 於 2009-10-7 14:52 編輯 [/i]
[table][tr][td][list=1][*]//8051[*]#include <reg52.h>
#include <string.h>
#include <intrins.h>[*]#define uchar unsigned char
#define uint unsigned int[*][*]void serial_init()
{
/* 9600,n,8,1,外部晶振11.0592MHz,查詢模式 */[*] TMOD = 0x20; // 定時器T1使用工作模式2
TH1 = 250;
TL1 = 250;
TR1 = 1; // 開始計時
PCON = 0x80; // SMOD = 1
SCON = 0x50; // 工作模式1,波特率9600kbit/s,允許接收
}[*][*] void sendByte()
{
TI = 0; // 清發送標誌位
while(!TI); // 等待發送完成
}[*][*]void main()
{[*]uchar *tmp = 0;[*]
serial_init() ;
//ADCRD = 1 ;
EX0 = 1; // 打開外部中斷0[*][*] RI = 0;
while(!RI);
*tmp = SBUF;[*]
while(1);
}[*][*]
[color=#0099cc]複製代碼[/color][/list]
[/td][/tr][/table]
以上是8051對RS232寫法
while(!RI);就是在讀取
*tmp = SBUF;讀取完成後寫入SBUF
以上是不完善的程式碼
但是也可以應付你所需要的
內容有些Bug
請自行處理
靠仔細看妳應該是電腦端的程式並非是8051的程式
抱歉~沒注意到~ 這是十幾年前的程式了,8051(Single chip)那頭你要設好速率(本例是 9600),
有問題建議你用示波器(單一觸發)勾勾看是哪一頭出問題.
#include <stdio.h>
#include <dos.h>
#include "ibmcom.h"
#include "parament.h"
#define IER 1 /* Interrupt enable register */
#define IIR 2 /* Interrupt ID register */
#define LCR 3 /* Line control register */
#define MCR 4 /* Modem control register */
#define LSR 5 /* Line status register */
#define MSR 6 /* Modem status register */
#define DTR 0x01 /* Data terminal ready */
#define RTS 0x02 /* Request to send */
#define OUT1 0x04 /* Output #1 */
#define OUT2 0x08 /* Output #2 */
#define DCTS 0x01 /* Delta clear to send */
#define DDSR 0x02 /* Delta data set ready */
#define TERI 0x04 /* Trailing edge ring indicator */
#define DRLSD 0x08 /* Delta Rx line signal detect */
#define CTS 0x10 /* Clear to send */
#define DSR 0x20 /* Data set ready */
#define RI 0x40 /* Ring indicator */
#define RLSD 0x80 /* Receive line signal detect */
#define DATA 0x03 /* 8 bits Data */
#define STOP 0x00 /* 1 Stop bit */
#define PARI 0x00 /* No parity */
#define RDR 0x01 /* Receive data ready */
#define ERRS 0x1E /* All the error bits */
#define DR 0x01 /* Data ready */
#define RLS 0x04 /* Receive line status */
#define TXR 0x20
#define THRE 0x02
#define MAX_PORT 4
#define TRUE 1
#define FALSE 0
#define PORT 2
#define SPEED 9600
#define RX_QUEUE_SIZE 2048 /* Receive queue size. Change to suit */
#define TX_QUEUE_SIZE 90 /* Receive queue size. Change to suit */
int uart_data; /* Data register */
int uart_ier; /* Interrupt enable register */
int uart_iir; /* Interrupt identification register */
int uart_lcr; /* Line control register */
int uart_mcr; /* Modem control register */
int uart_lsr; /* Line status register */
int uart_msr; /* Modem status register */
char com_installed; /* Flag: Communications routines installed */
int intnum; /* Interrupt vector number for chosen port */
char i8259bit; /* 8259 bit mask */
char old_i8259_mask; /* Copy as it was when we were called */
char old_ier; /* Modem register contents saved for */
char old_mcr; /* Restoring when we're done */
void interrupt (*old_vector)(); /* Place to save COM1 vector */
unsigned char tx_queue[90];
int tx_out,tx_in; /* Index of where to store next character */
int tx_chars; /* Count of characters in queue */
extern unsigned char rx_queue[QUEUE];
extern int rx_in; /* Index of where to store next character */
extern int rx_chars; /* Count of characters in queue */
const int uart_base[MAX_PORT] = { 0x3F8, 0x2F8, 0x3E8, 0x2E8 };
const char intnums[MAX_PORT] = { 0x0C, 0x0B, 0x0C, 0x0B };
const char i8259levels[MAX_PORT] = { 4, 3, 4, 3 };
extern long DATASTATUS;
void com_flush_rx(void);
int com_install(int portnum);
void set_speed(long speed);
void com_deinstall(void);
void com_set_parity(enum par_code parity, int stop_bits);
void interrupt com_interrupt_driver()
{
char iir; /* Local copy if IIR */
extern long DATASTATUS;
extern char TIMECOUNT;
while (!((iir = inportb(uart_iir)) & 1)) /* While there is an int ... */
{
disable();
switch (iir) /* Branch on interrupt type */
{
case 0: /* Modem status interrupt */
inportb(uart_msr); /* clear the interrupt */
break;
case 2: /* Transmit register empty */
outportb(uart_ier, /* off transmit interrupts */
inportb(uart_ier) & ~2);
break;
case 4: /* Received data interrupt */
rx_queue[rx_in] = inportb(uart_data); /* Grab received character */
if (rx_queue[rx_in] == 126)
DATASTATUS++;
TIMECOUNT=(TIMECOUNT | 0x02);
rx_chars++;
rx_in++;
if (rx_in>=QUEUE)
rx_in=rx_chars=0; /* rx_chars=0; */
break;
case 6: /* Line status interrupt */
inportb(uart_lsr); /* Just clear the interrupt */
} /* End switch */
} /* End 'is an interrupt' */
outportb(0x20,0x20); /* Send EOI to 8259 */
enable();
} /* End com_interrupt_driver() */
int com_install(int portnum)
{
if (com_installed) /* Drivers already installed */
return 3;
if ((portnum < 1) || (portnum > MAX_PORT)) /* Port number out of bounds */
return 1;
uart_data = uart_base[portnum-1]; /* Set UART I/O addresses */
uart_ier = uart_data + IER; /* for the selected comm */
uart_iir = uart_data + IIR; /* port */
uart_lcr = uart_data + LCR;
uart_mcr = uart_data + MCR;
uart_lsr = uart_data + LSR;
uart_msr = uart_data + MSR;
intnum = intnums[portnum-1]; /* Ditto for interrupt */
i8259bit = 1 << i8259levels[portnum-1]; /* vector and 8259 bit mask */
old_ier = inportb(uart_ier); /* Return an error if we */
outportb(uart_ier, 0); /* can't access the UART */
if (inportb(uart_ier) != 0)
return 2;
disable(); /* Save the original 8259 */
old_i8259_mask = inportb(0x21); /* mask, then disable the */
outportb(0x21, old_i8259_mask | i8259bit); /* 8259 for this interrupt */
enable();
com_flush_rx();
old_vector = getvect(intnum); /* Save old COMM vector, */
setvect(intnum, &com_interrupt_driver); /* then install a new one, */
com_installed = TRUE; /* and note that we did */
outportb(uart_lcr, 0x03); /* 8 data, no parity, 1 stop */
disable(); /* Save MCR, then enable */
old_mcr = inportb(uart_mcr); /* interrupts onto the bus, */
outportb(uart_mcr, /* activate RTS and leave */
(old_mcr & DTR) | (OUT2 + RTS)); /* DTR the way it was */
enable();
outportb(uart_ier, DR); /* Enable receive interrupts */
disable(); /* Now enable the 8259 for */
outportb(0x21, inportb(0x21) & ~i8259bit); /* this interrupt */
enable();
return 0; /* Successful installation */
} /* End com_install() */
void com_deinstall(void)
{
if (com_installed)
{ /* Don't de-install twice! */
outportb(uart_mcr, old_mcr); /* Restore the UART */
outportb(uart_ier, old_ier); /* registers ... */
disable();
outportb(0x21, /* ... the 8259 interrupt */
(inportb(0x21) & ~i8259bit) | /* mask ... */
(old_i8259_mask & i8259bit));
enable();
setvect(intnum, old_vector); /* ... and the comm */
com_installed = FALSE; /* interrupt vector */
} /* End com_installed */
} /* End com_deinstall() */
void set_speed(long speed)
{
unsigned divisor; /* A local temp */
if (com_installed)
{
if (speed < 2) speed = 2; /* Force proper input */
divisor = 115200L / speed; /* Recond baud rate divisor */
disable(); /* Interrupts off */
outportb(uart_lcr, /* Set up to load baud rate */
inportb(uart_lcr) | 0x80); /* divisor into UART */
outport(uart_data, divisor); /* Do so */
outportb(uart_lcr, /* Back to normal UART ops */
inportb(uart_lcr) & ~0x80);
enable(); /* Interrupts back on */
} /* End "comm installed" */
} /* End com_set_speed() */
const char lcr_vals[] = {DATA + PARI};
void com_set_parity(enum par_code parity, int stop_bits)
{
disable();
outportb(uart_lcr, lcr_vals[parity] | stop_bits);
enable();
} /* End com_set_parity() */
void com_flush_rx(void)
{
disable();
rx_chars = rx_in = 0;
enable();
}
void ract()
{
int herb;
clrscr();
if ((herb = com_install(PORT))!= 0)
{
printf ("com_install() error: %d\n",herb);
exit(1);
}
com_flush_rx();
delay(1);
set_speed(SPEED);
delay(50);
}
頁:
[1]