1.c è·å串å£å· c èªå¨è·å串å£å·
2.能帮我写一个用C语言实现的源码串口通讯程序吗?
c è·å串å£å· c èªå¨è·å串å£å·
ç¨Cæä¹åè·å串å£çå 容
ç驱å¨ç¨åºçæ¥å£å
ä¸è¬æ¯æ¯open(âå£åâ)
ç¨C/C++åä¸ä¸ªå°ç¨åºè¯»å串å£æ¥æ¶å°çæ°æ®ä½ 太幸è¿äºï¼å好ææä¸ä¸ªï¼ä½ å¨vc++6.0ä¸æµè¯ä¸ä¸ã
/* serrecv.c */
/* Receives and saves a file over a serial port */
/* Last modified: Septemeber , */
/* [goman] */
#include
#include
#include
/* Function to print out usage information */
void usage(void);
/* Function to set up the serial port settings with the specified baud rate,
no parity, and one stop bit */
void set_up_serial_port(HANDLE h, long baud);
/* Function to receive and save file from serial port */
void get_file_from_serial_port(HANDLE h, char *file_name, unsigned long file_length);
int main(int argc, char **argv)
{
HANDLE serial_port; /* Handle to the serial port */
long baud_rate = ; /* Baud rate */
char port_name[] = "COM1:"; /* Name of serial port */
unsigned long file_size; /* Size of file to receive in bytes */
unsigned long bytes_received; /* Bytes received from serial port */
unsigned long file_name_size; /* Size of file name in bytes */
char file_name[]; /* Name of file to receive */
/* Check mand line */
if (argc == 3)
{
/* Read in baud rate */
if (argv[1][1] != 'b' || sscanf(argv[2], "%ld", &baud_rate) != 1)
{
usage;
exit(0);
}
}
else if (argc != 1)
{
usage;
exit(0);
}
/* Open up a handle to the serial port */
serial_port = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
/* Make sure port was opened */
if (serial_port == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "Error opening port\n");
CloseHandle(serial_port);
exit(0);
}
/* Set up the serial port */
set_up_serial_port(serial_port, baud_rate);
/* Receive file name size from serial port */
ReadFile(serial_port, (void *)&file_name_size, sizeof(unsigned long), &bytes_received, NULL);
if (bytes_received != sizeof(unsigned long))
{
fprintf(stderr, "Error getting file name size.\n");
CloseHandle(serial_port);
exit(0);
}
/* Receive file name from serial port */
ReadFile(serial_port, (void *)file_name, file_name_size, &bytes_received, NULL);
if (bytes_received != file_name_size)
{
fprintf(stderr, "Error retrieving file name.\n");
CloseHandle(serial_port);
exit(0);
}
/* Append NULL terminator to end of string */
file_name[bytes_received] = '\0';
/* Receive file size from serial port */
ReadFile(serial_port, (void *)&file_size, sizeof(unsigned long), &bytes_received, NULL);
if (bytes_received != sizeof(unsigned long))
{
fprintf(stderr, "Error getting file size.\n");
CloseHandle(serial_port);
exit(0);
}
/* Get the file from the serial port */
get_file_from_serial_port(serial_port, file_name, file_size);
/* Print out success information */
printf("\n%lu bytes successfully received and saved as %s\n", file_size, file_name);
/* Close handle */
CloseHandle(serial_port);
return 0;
}
void usage(void)
{
fprintf(stderr, "Usage:\n");
fprintf(stderr, "\tserrecv [-b baud rate]\n");
fprintf(stderr, "\tDefault baud rate is \n");
fprintf(stderr, "tSupported baud rates: , , , , , \n");
return;
}
void set_up_serial_port(HANDLE h, long baud)
{
DCB properties; /* Properties of serial port */
/* Get the properties */
GetmState(h, &properties);
/* Set the baud rate */
switch(baud)
{
case :
properties.BaudRate = CBR_;
break;
case :
properties.BaudRate = CBR_;
break;
case :
properties.BaudRate = CBR_;
break;
case :
properties.BaudRate = CBR_;
break;
case :
properties.BaudRate = CBR_;
break;
case :
properties.BaudRate = CBR_;
break;
case :
properties.BaudRate = CBR_;
break;
default:
fprintf(stderr, "Invalid baud rate: %ld\n", baud);
usage;
exit(0);
break;
}
/* Set the other properties */
properties.Parity = NOPARITY;
properties.ByteSize = 8;
properties.StopBits = ONESTOPBIT;
SetmState(h, &properties);
return;
}
void get_file_from_serial_port(HANDLE h, char *file_name, unsigned long file_length)
{
FILE *data_file; /* File to create */
unsigned long bytes_left = file_length; /* Bytes left to receive */
unsigned long bytes_received_total = 0; /* Total bytes received */
unsigned long bytes_to_receive; /* Number of bytes to receive */
unsigned long bytes_received; /* Number of bytes receive */
char buffer[]; /* Buffer to store data */
/* Open the file */
data_file = fopen(file_name, "wb");
/* Quit if file couldn't be opened */
if (data_file == NULL)
{
fprintf(stderr, "Could not create file %s\n", file_name);
CloseHandle(h);
exit(0);
}
while (1)
{
/* Determine how many bytes to read */
if (bytes_left == 0)
{
break;
}
else if (bytes_left < )
{
bytes_to_receive = bytes_left;
}
else
{
bytes_to_receive = ;
}
/* Receive data over serial cable */
ReadFile(h, (void *)buffer, bytes_to_receive, &bytes_received, NULL);
if (bytes_received != bytes_to_receive)
{
fprintf(stderr, "Error reading file.\n");
CloseHandle(h);
exit(0);
}
/* Save buffer to file */
fwrite((void *)buffer, 1, bytes_received, data_file);
/* Decrement number of bytes left */
bytes_left -= bytes_received;
/* Increment number of bytes received */
bytes_received_total += bytes_received;
/* Print out progress */
printf("\r%5lu bytes received.", bytes_received_total);
}
fclose(data_file);
return;
}
Cè¯è¨åæå®ç°ä¸²å£æ¶åæ°æ®#include
#include
int main(void)
{
FILE *fp;
char temp;
char buf[];
if((fp = fopen("3","r")) == NULL)
puts("this way doesn't work!\n");
else
puts("this way works!\n");
while(1)
{
temp = 0;
fscanf(fp,"%c",&temp);
if(temp != 0)
putchar(temp);
else
Sleep();
}
fclose(fp);
return 0;
}
以åå¼çï¼å¥½ä¹ 没çäºï¼ä¸ç¥å°å¯¹ä¸å¯¹ã
è¿æä¸é¢è¿æ®µï¼
#include
#include
HANDLE h;
int main(void)
{
h=CreateFile(TEXT("COM3"),//COM1å£
GENERIC_READ|GENERIC_WRITE, //å 许读åå
0, //ç¬æ¹å¼
NULL,
OPEN_EXISTING, //æå¼èä¸æ¯å建
0, //åæ¥æ¹å¼
NULL);
if(h==(HANDLE)-1)
{
printf("æå¼COM失败!\n");
return FALSE;
}
else
{
printf("COMæå¼æåï¼\n");
}
Setupm(h,,); //è¾å ¥ç¼å²åºåè¾åºç¼å²åºå¤§å°é½æ¯
COMMTIMEOUTS TimeOuts;
//è®¾è¯»è¶ æ¶
TimeOuts.ReadIntervalTimeout=;
TimeOuts.ReadTotalTimeoutMultiplier=;
TimeOuts.ReadTotalTimeoutConstant=;
//设å®åè¶ æ¶
TimeOuts.WriteTotalTimeoutMultiplier=;
TimeOuts.WriteTotalTimeoutConstant=;
SetmTimeouts(h,&TimeOuts); //è®¾ç½®è¶ æ¶
DCB dcb;
GetmState(h,&dcb);
dcb.BaudRate=; //æ³¢ç¹ç为
dcb.ByteSize=8; //æ¯ä¸ªåèæ8ä½
dcb.Parity=NOPARITY; //æ å¥å¶æ ¡éªä½
dcb.StopBits=ONE5STOPBITS; //两个åæ¢ä½
SetmState(h,&dcb);
DWORD wCount;//读åçèæ°
BOOL bReadStat;
while(1)
{
Purgem(h,PURGE_TXCLEAR|PURGE_RXCLEAR); //æ¸ ç¼å²åº
char str[9]={ 0};
printf("%s\n",str);
bReadStat=ReadFile(h,str,9,&wCount,NULL);
if(!bReadStat)
{
printf("
æä¹éè¿ä¸²å£è¯»ååçæºæ个å°åçæ°æ®ï¼è¯·ç¨Cè¯è¨ååºæ¥ã*
æ人以鱼,ä¸å¦æ人以æ¸
*
é¦å ï¼ä½ è¦æç¡®å¨Cè¯ä¸è¯»åå ååæ¯åºäºæéã
3.æ¯å¦è¯»åå åå°å0xä¸çæ°æ®
Cè¯è¨ä¸å¯¹äºå åç访æ¯åºäºæï¼è¿ä¸ªæ¯åº¸ç½®çï¼å ·ä½æå¦ä¸
unsigned int *p= ï¼unsigned int*ï¼0x ï¼//å®ä¹éï¼å¹¶ä¸ä½¿æéæåäº0xè¿ä¸ª å åå°åï¼
é£ä¹*på°±æ¯æç»ä½ è¦è¯»åçæ°æ®äºã
4.è³äºå¦ä½éè¿ä¸²å£æ¾ç¤ºå°çµèæå°±ä¸å¤äºï¼è¿ä¸æ¯é¾ç¹ï¼ï¼æ®ä½ é½ç¥éäºï¼åå°ä¸²å£ ç¼å²åºï¼å¨ä¸²å£è°è¯å©æä¸å°±å¯ä»¥çå°ã
5.è½ç¶æ²¡æè´´åºå ·ä½ä»£ç ï¼ä½è¿éé¢çææ³å¯ä»¥è®©ä½ 解å³
æ ç¾ï¼ä½æç»å ¸ ä¸ä¸ç¯ï¼æåæ¯æ¯è«çè¯è¯ æåæ¯æ¯è«è¡å¨çè¯è¯ ä¸ä¸ç¯ï¼æè¯è¯¯ç¨è¤è´¬çä¾å è¤è´¬è¯¯ç¨çæè¯Linuxä¸å¦ä½ä½¿ç¨c/c++å®ç°æ£æµæ°å¢ä¸²å£ï¼å¹¶è¯»å串å£å·
Linuxä¸é¢æ设æ件
串å£è£ 好驱å¨å ä¼æ¾ç¤ºå¨devä¸
ç¶å对è¿ä¸ª
Cè¯è¨ä¸å¦ä½å¯¹ä¸²å£è¿è¡æä½Cè¯è¨ä¼ææä½ä¸²å£çåºå½æ°çï¼æç §ä¸²å£åºæ°æ è¯å®ç°è°
çµèä¸ç串å£å·æ¯ä»ä¹ææ串å£å«å串è¡æ¥å£,ä¹ä¸²è¡éä¿¡æ¥å£,æçµæ°æ åååè®®æ¥åå æ¬RS--CãRS-ãRSãUSBçã RS--CãRS-ä¸RS-æ å对æ¥å£ççµæ°ç¹æ§ååºè§å®,ä¸æ¶åæ¥æ件ãçµç¼æåè®®ãUSBæ¯è¿å å¹´åå±èµ·æ¥çæ°åæ¥å£æ å,主è¦åºç¨äºéæ°æ®ä¼ è¾åã RS--C:ä¹ç§°æ å串å£,æ¯ç®åæ常ç¨çä¸ç§ä¸²è¡é讯æ¥å£ãå®æ¯å¨å¹´ç±ç¾å½çµåå·¥ä¸åä¼(EIA)èåè´å°ç³»ç»ã è°å¶è§£è°å¨å家å计ç®æºç»ç«¯ç产åå ±åå¶å®çç¨äºä¸²è¡é讯çæ åãå®çåæ¯âæ°æ®ç»ç«¯è®¾å¤(DTE)åæ°æ®é讯设å¤(DCE)ä¹é´ è¡äºè¿å¶æ°æ®äº¤æ¢æ¥å£ææ¯æ åâãä¼ ç»çRS--Cæ¥å£æ åææ ¹çº¿,éç¨æ åè¯Dåæ头座ãåæ¥çPCä¸ä½¿ç¨ç®åäºç9è¯Dæ座ãç°å¨åºç¨ä¸è¯æ头已å¾å°éç¨ãç°å¨ççµèè¬æ两个串è¡å£:COM1åCOM2,ä½ å°è®¡ç®æºåé¢è½çå°9éDå½¢æ¥å£å°±æ¯äºãç°å¨æå¾å¤ææ°æ®çº¿æè ç©æµæ¥æ¶å¨é½éç¨COM
å¦ä½ç¨Cè¯è¨åä¸ä¸ªè¯»ãå串å£çç¨åºï¼å¤§è´è¿ç¨å°±æ¯
é 置串å£éä¿¡ï¼å 串å£å·ãæ³¢ç¹ãéªä½ãåæ¢ä½è¿äºä¿¡æ¯ï¼
æå¼ä¸²å£ï¼åæå¼æ件ä¸æ ·ï¼å¨Linuxæ¯è¿æ ·ï¼Windowsä¸æ²¡è¯è¿ï¼ä¼°è®¡ä¹å·®ä¸å¤ï¼
åéæ°æ®ï¼å³å串å£ï¼å°±è·åæ件类似ï¼
读å
ç¼ååçæºä¸²å£æ¶åæ°æ®çå®æ´ç¨åºï¼Cè¯è¨ç¼åï¼æç¨çæ°åè¯çï¼å æ ¸ï¼è·å·®ä¸å¤ï¼æé纳
void UART_Initial (void)
{
P_Quasi_Mode; //Setting UART pin as Quasi mode for tran *** it
P_Quasi_Mode; //Setting UART pin as Quasi mode for tran *** it
SCON_1 = 0x; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE( - (/uBaudrate)-1); /* MHz */
RL3 = LOBYTE( - (/uBaudrate)-1); /* MHz */
set_TR3; //Trigger Timer3
}
以ä¸æ¯åå§åç
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
è¿ä¸ªæ¯åé
void UART_isr (void) interrupt 4 //
ææ ·å¨WINDOWSä¸ç¨Cè¯è¨ç¼å串å£æ¥æ¶æ°æ®ç¨åº#include
#include
int main(void)
{
FILE *fp;
char temp;
char buf[];
if((fp = fopen("3","r")) == NULL)
puts("this way doesn't work!\n");
else
puts("this way works!\n");
while(1)
{
temp = 0;
fscanf(fp,"%c",&temp);
if(temp != 0)
putchar(temp);
else
Sleep();
}
fclose(fp);
return 0;
}
以åçï¼å¥½ä¹ çï¼ä¸ç¥å°å¯¹ä¸å¯¹ã
è¿ä¸é¢è¿æ®µï¼
1
2
3
4
5
6
7
8
9
#include
#include
HANDLE h;
int main(void)
{
h=CreateFile(TEXT("COM3"),//COM1å£
GENERIC_READ|GENERIC_WRITE, //å 许读åå
0, //ç¬å æ¹å¼
NULL,
OPEN_EXISTING, //æå¼èä¸æ¯å»º
0, //åæ¥å¼
NULL);
if(h==(HANDLE)-1)
{
printf("æå¼COM失败!\n");
return FALSE;
}
else
{
printf("COMæå¼æåï¼\n");
}
Setupm(h,,); //è¾å ¥ç¼å²åºåè¾åºç¼å²åºç大å°é½æ¯
COMMTIMEOUTS TimeOuts;
//å®è¯»è¶ æ¶
TimeOuts.ReadIntervalTimeout=;
TimeOuts.ReadTotalTimeoutMultiplier=;
TimeOuts.ReadTotalTimeoutConstant=;
//设å®åè¶ æ¶
TimeOuts.WriteTotalTimeoutMultiplier=;
TimeOuts.WriteTotalTimeoutConstant=;
SetmTimeouts(h,&TimeOuts); //è®¾ç½®è¶ æ¶
DCB dcb;
GetmState(h,&dcb);
dcb.BaudRate=; //æ³¢ç¹ç为
dcb.ByteSize=8; //æ¯ä¸ªåèæ8ä½
dcb.Parity=NOPARITY; //æ å¥å¶æ ¡éªä½
dcb.StopBits=ONE5STOPBITS; //两个åæ¢ä½
SetmState(h,&dcb);
DWORD wCount;//读åçåè
BOOL bReadStat;
while(1)
{
Purgem(h,PURGE_TXCLEAR|PURGE_RXCLEAR); //æ¸ ç©ºç¼å²åº
char str[9]={ 0};
printf("%s\n",str);
bReadStat=ReadFile(h,str,9,&wCount,NULL);
if(!bReadStat)
{
printf("读串å£
æ ç¾ï¼ä½æç»å ¸ ä¸ä¸ç¯ï¼æåæ¯æ¯è«çè¯è¯ æåæ¯æ¯è«è¡å¨çè¯è¯ ä¸ä¸ç¯ï¼æè¯è¯¯ç¨è¤è´¬çä¾å è¤è´¬è¯¯ç¨çæè¯能帮我写一个用C语言实现的串口通讯程序吗?
供参考
void MCU_Initialize(void)
{
SCON =0xDC; //在.MHz下,设置串行口波特率为,源码新华社源码方式3,源码c ftp 源码并允许接收 9为
SCON = 0x;
TCON = 0x;
TMOD |=0x; //定时器工作于方式2,自动装载方式 T0 位定时器
TH1=0xFD;
IP = 0X;
ES=1;
ET0=1;
//TR1=1;
EA=1;
}
////////////////////////////发送一个字节/////////////////////////////
/*void putchar(unsigned char byte)
{
if(JO_check(byte)==1)
TB8=0;
else
TB8=1;
SBUF=byte;
while(!TI)
TI=0;
} */
//////////////////////////////////串口接受程序 与通信//////////////////////
void RX() interrupt 4
{
if(RI==1)
{
RI=0;
CF[CaiYangJiShu]=SBUF;
if(RB8==JO_check(CF[CaiYangJiShu]))
{
Ji_Ou_fail=0; //奇偶效验失败 通知F从新发送
}
CaiYangJiShu++;
if(CaiYangJiShu==8)
{
TR1=0;
CS_=1;
CaiYangJiShu=0;
// CAIYANG_over=0; //完成一次采样标志
if(CF[0]==0x && CF[1]==0x && CF[6]==0xAA && CF[7]==0xAA&&Ji_Ou_fail==1)
{
CAIYANG_over=0;
CaiYnagDat=0;
CaiYnagDat<<=8;
CaiYnagDat += CF[5];
CaiYnagDat<<=8;
CaiYnagDat += CF[4];
CaiYnagDat<<=8;
CaiYnagDat += CF[3];
CaiYnagDat<<=8;
CaiYnagDat += CF[2];
}
}
}
}
这个程序是源码jar 查看源码带奇偶校验的,可以在设置的时候去掉