『壹』 用C語言讀埠數據
你說的方式沒錯。
『貳』 單片機埠用C語言怎麼定義
單片機的介面是指連接到單片機系統的所有外部通道,比如RS232介面等等;
而埠指的是單片機引腳這些單片機的直接輸出輸入口。
因此通常對埠的定義就是直接定義每一個引腳。以51為例:
51單片機的埠分類方法:P0、 P1、 P2、 P3.
這分別代表一組引腳,每組有8個引腳;如 P0 是由 P0.0、P0.1、P0.2...P0.7共8個引腳組成的。
『叄』 怎麼用C語言中斷方式實現串口的讀寫
#include <stdio.h>
#include <dos.h>
#include <time.h>
#define LSB 0
#define MSB 1
#define RXR 0
#define TXR 0
#define IER 1
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6
#define Com1_base 0x3f8
#define uchar unsigned char
volatile uchar inputData;
volatile uchar onInput = 0x00;
volatile uchar onOutput = 0x00;
volatile uchar inputdata[256]; /*設設置接收緩沖區大小*/
volatile unsigned int count; /*中斷接收的數據數目*/
int datacount;/*當前已發送數據條數*/
void interrupt (*OldVect)(); /*函數是用來獲取中斷處理程序的入口地址的*/
void interrupt SerialISR();
void InitCom()
{
uchar inttemp;
/*設置波特率什麼的*/
outportb(Com1_base+LCR,0x80); /*使LCR的高位為1,以便讀取其它寄存器*/
outportb(Com1_base+LSB,0x0c); /*除數鎖存器(低8位)DLL*/
outportb(Com1_base+MSB,0x00); /*除數鎖存器(高8位)DLH 產生2400波特率*/
outportb(Com1_base+LCR,0x03); /*8位數據,1位停止位,無校驗*/
outportb(Com1_base+IER,0x01); /*接收採用中斷方式*/
/*設置中斷向量*/
OldVect = getvect(0x0c); /*函數是用來獲取中斷處理程序的入口地址的*/
disable();
inttemp = inportb(0x21)&0xef;
outportb(0x21,inttemp);
setvect(0x0c,SerialISR); /*設置SerialISR的中斷入口地址為0X0C*/
enable();
}
void CloseCom()
{
disable();
outportb(Com1_base+IER,0x00); *禁止中斷*/
outportb(Com1_base,0x00);
outportb(0x21,inportb(0x21)|~(0xef));
setvect(0x0c,OldVect);
}
void interrupt SerialISR()
{
/*串口中斷服務代碼*/
inputData = inportb(Com1_base+RXR);
onInput = 0x01;
inputdata[count]=inputData;
count++;
/*服務代碼結束*/
outportb(0x20,0x20); /*中斷結束的代碼*/
}
void SendChar(uchar key)
{
while( ((inportb(Com1_base + LSR)) & 0x40) == 0);
outportb(Com1_base + TXR,key);
}
/*...........延時函數......................*/
void delay(unsigned int n)
{
unsigned int i,k;
for(k=0;k<n;k++)
{
for(i=1;i<1142;i++)
;
}
}
/*........CDMA命令發送函數.................*/
void CDMA_CommandSend(char *p,unsigned int n)
{
int i,k,m,l;
int flag=0;
int selse_flag=0; int selse_flag_1=0;
int selse_flag1=0;int selse_flag1_1=0;
time_t start,end;
double dif=0;
char a;
uchar bExit_flag = 0x00;
count=0;
while(!bExit_flag)
{
count=0;
for(i=0;i<n;i++)
{SendChar(*p);delay(9000);p++;}
/*..........等待2S..................*/
time (&start);
dif=0;
while(dif<2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
if(count>14)
{
time (&start);
dif=0;
while(dif<3)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
}
/*..........判斷發送命令是否成功..................*/
for(m=0;m<count;m++)
{
if(count>10)
{
for(l=0;l<count;l++)
{
if(inputdata[l-1]=='N'&&inputdata[l-2]=='E'&&inputdata[l-3]=='P'&&inputdata[l-4]=='O'&&inputdata[l-5]=='P'&&inputdata[l-6]=='P'&&inputdata[l-7]=='P'&&inputdata[l-8]=='V') { selse_flag_1=1;}
if(inputdata[l-1]=='N'&&inputdata[l-2]=='E'&&inputdata[l-3]=='P'&&inputdata[l-4]=='O'&&inputdata[l-5]=='P'&&inputdata[l-6]=='C'&&inputdata[l-7]=='T'&&inputdata[l-8]=='V') { selse_flag1_1=1;}
}
if(selse_flag_1==1){if(inputdata[m-1]=='3'&&inputdata[m-2]=='3'&&inputdata[m-3]==':'&&inputdata[m-4]=='T') selse_flag=1;}
if(selse_flag1_1==1){if(inputdata[m-1]=='0'&&inputdata[m-2]==','&&inputdata[m-3]=='1'&&inputdata[m-4]==':'&&inputdata[m-5]=='N') selse_flag1=1;}
if(selse_flag_1==1||selse_flag1_1==1)
{
if(selse_flag==1) {if(inputdata[m-1]=='0'&&inputdata[m-2]==':'&&inputdata[m-3]=='N'&&inputdata[m-4]=='E') flag=1;}
if(selse_flag1==1) {if(inputdata[m-1]=='0'&&inputdata[m-2]==','&&inputdata[m-3]=='1'&&inputdata[m-4]==':'&&inputdata[m-5]=='S') flag=1;}
}
else {if(inputdata[m-1]=='O'&&inputdata[m]=='K') {flag=1; }}
}
else {if(inputdata[m-1]=='O'&&inputdata[m]=='K') flag=1; }
}
if(flag==1){bExit_flag = 0x01;}
else {p=p-n; }
for(i=0;i<count;i++) printf("%c",inputdata[i]);
/*........按空格停止測試.............................*/
if(kbhit()){a=getch(); if(a==' '){CloseCom(); exit(1);}}
}
}
/*........數據測試發送任務.....................*/
void Data_Send(char *pcomd,int n,char *pdata,int m)
{
int i,k,l;time_t start,end;
double dif=0;
count=0;
for(i=0;i<n;i++)
{
SendChar(*pcomd);delay(9000);pcomd++;
}
time (&start);
dif=0;
while(dif<0.2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
for(l=0;l<m;l++)
{
SendChar(*pdata);pdata++;
}
printf("The data num:%d",datacount);
datacount++;
}
void main()
{int i;char a;
/*........模塊測試命令..................................*/
uchar CDMA_COMMAND_1[]={"at\r"};
uchar CDMA_COMMAND_2[]={"atz\r"};
uchar CDMA_COMMAND_3[]={"ate1v1\r"};
uchar CDMA_COMMAND_4[]={"AT+CRM=1;+CPS=33;+CMUX=1;+CTA=0\r"};
uchar CDMA_COMMAND_5[]={"AT+VPPPOPEN\r"};
uchar CDMA_COMMAND_6[]={"AT+VTCPOPEN=1,\"60.63.42.129\",1234\r"};
uchar CDMA_COMMAND_7[]={"AT+VTCPSEND=1,20\r"};
uchar CDMA_DATA[]={"ABCDEFGHIJKLMNOPQRST"};
uchar CDMA_COMMAND_9[]={"AT+VPPPCLOSE\r"};
uchar CDMA_COMMAND_8[]={"AT+VTCPCLOSE=1\r"};
uchar bExit_flag1 = 0x00;
time_t start,end;
double dif=0;
InitCom();/*初始化埠1*/
inputData = inportb(Com1_base+RXR);
while(!bExit_flag1)
{
/*.................................................................*/
if(kbhit()) /*按任意鍵開始測試CDMA*/
{
/*.............................................................. ...*/
/*.........發送TCP斷開命令.....................................*/
CDMA_CommandSend(CDMA_COMMAND_8,strlen(CDMA_COMMAND_8));
/*.........發送PPP斷開命令......................................*/
CDMA_CommandSend(CDMA_COMMAND_9,strlen(CDMA_COMMAND_9));
/*.........發送AT命令..........................................*/
CDMA_CommandSend(CDMA_COMMAND_1,strlen(CDMA_COMMAND_1));
/*.........發送ATZ命令.........................................*/
CDMA_CommandSend(CDMA_COMMAND_2,strlen(CDMA_COMMAND_2));
/*.........發送ATE1V1命令......................................*/
CDMA_CommandSend(CDMA_COMMAND_3,strlen(CDMA_COMMAND_3));
/*.........發送AT初始化命令....................................*/
CDMA_CommandSend(CDMA_COMMAND_4,strlen(CDMA_COMMAND_4));
/*.........發送PPP拔號命令.....................................*/
CDMA_CommandSend(CDMA_COMMAND_5,strlen(CDMA_COMMAND_5));
/*.........發送網路連接命令....................................*/
CDMA_CommandSend(CDMA_COMMAND_6,strlen(CDMA_COMMAND_6));
/*.........發送數據............................................*/
datacount=0;
while(1)
{
Data_Send(CDMA_COMMAND_7,strlen(CDMA_COMMAND_7),CDMA_DATA,strlen(CDMA_DATA));
time (&start);
dif=0;
while(dif<0.2)
{
delay(9000);
time (&end);
dif = difftime (end,start);
}
if(kbhit()){a=getch(); if(a==' '){bExit_flag1 = 0x01; break;}}
}
/*.........發送TCP斷開命令.....................................*/
for(i=0;i<3;i++)
CDMA_CommandSend(CDMA_COMMAND_8,strlen(CDMA_COMMAND_8));
/*.........發送PPP斷開命令......................................*/
for(i=0;i<3;i++)
CDMA_CommandSend(CDMA_COMMAND_9,strlen(CDMA_COMMAND_9));
bExit_flag1 = 0x01;
}
/*.................................................................*/
}
CloseCom(); /*關閉埠1*/
printf("Bye~.\n");
}
『肆』 如何用C程序獲取本地可用埠
可以打開USB介面上的設備,或者打開USB控制器,那涉及到windows的驅動訪問。
一般訪問設備使用CreateFile打開設備,然後使用ReadFile/WriteFile讀寫設備。
比如:
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...); //指定以非同步方式打開
BYTE bBuffer[100];
OVERLAPPED o = { 0 };
o.Offset = 345;
BOOL bReadDone = ReadFile(hFile, bBuffer, 100, NULL, &o); // bReadDone 指定I/O請求是不是以同步方式打開
DWORD dwError = GetLastError();
if (!bReadDone && (dwError == ERROR_IO_PENDING)) { //非同步方式打開
// The I/O is being performed asynchronously; wait for it to complete
WaitForSingleObject(hFile, INFINITE);
bReadDone = TRUE;
}
if (bReadDone) {
// o.Internal contains the I/O error
// o.InternalHigh contains the number of bytes transferred
// bBuffer contains the read data
} else {
// An error occurred; see dwError
}
『伍』 C語言怎樣直接讀寫硬體
BCB中利用__emit__函數可以直接將二進製程序代碼嵌入程序中,這樣就可以實現一些底層的操作。由於直接操作系統底層,這種方法可能會導致系統的不穩定。
下面是利用__emit__函數讀寫硬體埠的方法。
//讀埠
//port參數為輸入埠地址,value為返回值.
unsigned char __fastcall inportb(unsigned short int port)
{
unsigned char value;
__emit__(0x8b,0x95,&port); //把埠地址送到EDX寄存器中
__emit__(0x66,0xec); //從埠中讀入數據到AL寄存器中
__emit__(0x88,0x85,&value); //把AL寄存器中的值輔給value
return value;
}
//---------------------------------------------------------------------------
//寫埠
//port參數為輸出埠地址,value參數為輸出值
void __fastcall outportb(unsigned short int port,unsigned char value)
{
__emit__(0x8b,0x95,&port); //把埠地址送到EDX寄存器中
__emit__(0x8a,0x85,&value); //把value送到AL寄存器中
__emit__(0x66,0xee); //把AL寄存器中的值寫入埠
『陸』 用C語言編寫單片機編程的時候,埠的讀和寫的標志語句是哪一句舉個例子
unsigned char x;
x=P0;//這就是讀埠;
.......
P0=x;
//這就是寫埠.如果x=0x3f,也就是二進制的00111111,那麼這句執行後
//P0_0=1,P0_1=1,P0_2=1,P0_3=1,P0_4=1,P0_5=1,P0_6=0,P0_7=0;
『柒』 如何用c編寫程序 讀取埠com xx 的數據
com串口在windows系統下被封裝成了一個文件,文件名就是串口名,沒有路徑直接寫名字,讀寫方法和普通文件讀寫方法相同,就是需要先設置一些屬性,比如位元組長度,波特率等等,屬性設置C語言的文件函數庫沒有,需要調用WINDOWS的API函數,C語言將所有windows的API函數聲明道了windows.h中。。。。
『捌』 如何用C語言寫出讀單片機埠的命令。
uchar D=P3;
uchar temp=0;
//如果取高四位
temp=D ^ 0xf0;
//如果取低四位
temp=D ^ 0xf;
//取中間的
temp= D ^ D1;
temp =temp ^ D2;
temp= temp ^ D3;
temp= temp ^ D4;
『玖』 Ubuntu如何用C語言寫從系統配置文件中讀取ip和埠的相關代碼
可以寫成命令行參數的模式的,不用修改代碼,形如:
./server192.168.1.11210088
./client192.168.1.11210088
『拾』 用C語言編程式控制制一個埠如何編寫
#include<reg52.h>
sbit led=P0^0;
void main()
{
int a,b;
led=0;
for(a=110;a;a--)
for(b=11;b;b--);
led=1;
}