當前位置:首頁 » 編程語言 » 帶中斷的串口通信c語言程序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

帶中斷的串口通信c語言程序

發布時間: 2023-04-17 18:39:26

① 單片機串列口通信程序c語言

/*
程序把接收的數據發送出去,波速率為2400。
打開串口調試軟體,把波速率設置為2400,
向板發送一個位元組數據,軟體應能接收到同樣的數據。

*/

#include<reg51.h>
void delayms(unsigned int i);
unsigned char b;
void rs_dmx() interrupt 4 using 2//串口中斷服務程序
{

b=SBUF;//接收數據

SBUF=b;//把接收的數據發送出去
while(TI==0);TI=0;
delayms(1);

RI=0;
}
main()
{
//write(1,60);
//b=read(1);
EA=1;
// TR0=1;
// ET0=1;
// TMOD=0X01;

TMOD=0x21;

TH1=0xF3;//波速率為2400
TL1=0xf3;
TR1=1;
EA=1;
SCON=0XD0;

ES=1;

while(1)
{

}

}

void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}

自己改波特率,該程序通過單片機與串口助手相互通信

② 用C語言實現89C51串口通信程序

void Send_Byte(uchar i)
{
WDI = ~WDI;
TI = 0;
SBUF = i;
while(TI==0)
WDI = ~WDI;
TI = 0;
}
void Send_String(uchar *string)
{
while(*string!=0)
{
Send_Byte(*string);
string ++;
}
}

void Com_A_Int() interrupt 4
{
uchar idata status;
status = SBUF;
RI = 0;
if (status == 0x02)
Send_String("HELLO")
if (status == 0x55)
Send_String("THIS IS A WELL BEGIN!")
}

這是鋒飢串口中喊段斷程序,其他的你可以自己鄭基譽根據實際情況編寫

③ 急!!!單片機C語言實現串口通信編程

以下是我剛改的程序編譯成功了
請參考

#include"reg51.h"
//定義全局變數
unsigned char data_10[10]={0,0,0,0,0,0,0,0,0,0};
unsigned char Time_50ms,count;
bit flag=0;
bit data_flag=0;
/*********************************************************************************************
函數名:UART串口初始化函數
調 用:UART_init();
參 數:無
返回值:無
結 果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(佔用)
備 註:振盪晶體為12MHz,PC串口端設置 [ 4800,8,無,1,無 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
ES = 1; //允許UART串口的中斷
TMOD |= 0x20;//定時器T/C1工作方式2
SCON = 0x50;//串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
TH1 = 0xF3;//定時器初值高8位設置
TL1 = 0xF3;//定時器初值低8位設置
PCON = 0x80;//波特率倍頻(屏蔽本句波特率為2400)
TR1 = 1;//定時器啟動
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:UART串口接收中斷處理函數
調 用:[SBUF收到數據後中斷處理]
參 數:無
返回值:無
結 果:UART串口接收到數據時產生中斷,用戶對數據進行處理(並發送回去)
備 註:過長的處理程序會影響後面數據的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切換寄存器組到1
TR0=1; //打開定時器開始計時
RI = 0;//令接收中斷標志位為0(軟體清零)
data_10[count] = SBUF;//將接收到的數據送入變數 UART_data
count++;//接收到一個位元組數據計數+1
if(count>=10) //如果接收到10個數據
{
TR0=0; //停止定時器
TH0 = 0x3C; //給定時器賦初值
TL0 = 0xB0; //給定時器賦初值
count=0;//清零數據計數
//data_flag=1; //數據有效標志位
SBUF = 0x55;//返回數據 55H
while(TI == 0);//檢查發送中斷標志位
TI = 0;//令發送中斷標志位為0(軟體清零)
}
if(flag)
{
TR0=0; //停止定時器
TH0 = 0x3C; //給定時器賦初值
TL0 = 0xB0; //給定時器賦初值
count=0;//清零數據計數
SBUF = 0xff;//返回數據 ffH
while(TI == 0);//檢查發送中斷標志位
TI = 0;//令發送中斷標志位為0(軟體清零)
}
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:定時/計數器初始化函數
調 用:T_C_init();
參 數:無
返回值:無
結 果:設置SFR中T/C1和(或)T/C0相關參數
備 註:本函數控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/**********************************************************************************************/
void T_C_init (void){
TMOD |= 0x01; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
EA = 1;//中斷總開關
TH0 = 0x3C; //16位計數寄存器T0高8位
TL0 = 0xB0; //16位計數寄存器T0低8位(0x3CB0 = 50mS延時)
ET0 = 1; //T/C0中斷開關
TR0 = 0; //T/C0開關
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:定時/計數器0中斷處理函數
調 用:[T/C0溢出後中斷處理]
參 數:無
返回值:無
結 果:重新寫入16位計數寄存器初始值,處理用戶程序
備 註:必須允許中斷並啟動T/C本函數方可有效,重新寫入初值需和T_C_init函數一致
/**********************************************************************************************/
void T_C0 (void) interrupt 1 using 1{ //切換寄存器組到1
TH0 = 0x3C; //16位計數寄存器T0高8位(重新寫入初值)
TL0 = 0xB0; //16位計數寄存器T0低8位(0x3CB0 = 50mS延時)
Time_50ms++; //50ms到 計數+1
if(Time_50ms>=100)
{
Time_50ms=0;// 清零50ms計數
flag=1; //5s時間 標志置位
TR0=0;//關閉計時器
}
}
/**********************************************************************************************/
main()
{
IP = 0x10; //中斷優先順序設置(串口中斷最高優先順序)
UART_init();//初始化串口
T_C_init(); // 初始化計數器
while(1);// 空循環
}

④ 求c語言單片機串口通信程序,是兩塊89c51之間通信。要求在問題補充裡面,非常感謝!

我曾經寫過的串口通信程序,僅當參考,要完全符合你要求的,實在是沒有!!
//#include <STC12C5A60.H>
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i,e;
uchar code tem[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code table[]="阿斯頓 ";
unsigned char t[100];
void init()
{
TMOD=0x20; //設置計時器為1,TMOD為定時器工作方式寄存橡亮器
TH1=0xfd; //裝初值-- T1為0XFD次溢出
TL1=0xfd; //裝初值-- T1為0XFD次溢出
TR1=1; //定時器運行控制位
REN=1; //允許串口接收位
SM0=0; //設定串口工作方式梁攔寬為1
SM1=1;
EA=1; //中斷總開關
ES=1; //串口中斷開
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{

init();
e=0;
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;table[i]!='\0';i++)
{
SBUF=table[i]; //將table[i]里的值放到SBUF中
while(!TI); //TI=1發送完畢
TI=0; delayms(1); //發送數據
}

for(i=0;t[i]!=0;i++)
{SBUF=t[i];
while(!TI);
TI=0; delayms(1);
}
ES=1;
flag=0;
}
}
}
void ser()interrupt 4 //串口中斷衡中程序
{
RI=0; //表示接受數據 接受完成自動制1
t[e]=SBUF; //接受到的放到a內
if(t[e]=='/')
for(i=0;t[i]!=0;i++)
{t[i]='\0';e=0;}
else e++;
flag=1;

}

⑤ 誰有,51單片機串口中斷接受pc發送字元串 c程序,謝謝

#include
<reg52.h>悔模
bit
Flag;
//串口接收到字元的標志
unsigned
char
UartChar;
void
InitUART(void);
void
SendByte(unsigned
char
dat);
void
SendStr(unsigned
char
*s);
void
main
(void)
{
InitUART();
//串口初始化
Flag
=
0;
while
(1)
{
if(Flag
==
1)
{
Flag
=
0;
SendByte(UartChar);
if(UartChar
==
'\r')
{
SendByte('\n');
}
}
}
}
/*----------------------------
串口初始化--------------------------------------------------------------*/
void
InitUART(void)
{
SCON
=
0x50;
//
SCON:
模式
1,
8-bit
UART,
使能接收
TMOD
|=
0x20;
//
TMOD:
timer
1,
mode
2,
8-bit
重裝
TH1
=
0xFD;
//
TH1:
重裝值
9600
波特率
晶穗前穗振
11.0592MHz
TR1
=
1;
//
TR1:
timer
1
打開
EA
=
1;
//打開總中斷
ES
=
1;
//打開串口中斷
}
/*-------------------------------
發送一個位元組---------------------------------------*/
void
SendByte(unsigned
char
dat)
{
SBUF
=
dat;
while(!TI);
TI
=
0;
}
/*-------------------
發送一個字元串------------------------------------------*/
void
SendStr(unsigned
char
*s)
{
while(*s
!=
'\0')
//字元串是否發送完猜卜,
{
SendByte(*s);
s++;
}
}
/*----------------串口中斷程序----------------------------------------*/
void
UART_SER
(void)
interrupt
4
//串列中斷服務程序
{
if(RI)
//判斷是接收中斷產生
{
RI=0;
//標志位清零
UartChar
=
SBUF;
//讀入緩沖區的值
Flag
=
1;
//把值輸出到P1口,用於觀察
}
}

⑥ 怎麼用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");
}

⑦ 急需單片機W78E58B與pc串口通信的C語言程序代碼,發送用查詢方式,接收用中斷方式的程序。

#include <REG52.H>

bit Flag;
unsigned int ReData,SenData;

void main (void) {

SCON = 0x50; //REN=1允許串列接受狀態,串口工作模式1
TMOD|= 0x20; //定時器工作方式2
PCON= 0x00;
TH1 = 0xFD; //baud reload value 9600、數據位8、停止位1。效驗位無 (11.0592)
TL1 = 0xFD;
TR1 = 1;
ES = 1; //手數開串口中斷
EA = 1; // 開總中斷

while(1)
{

if (Flag==1)
{
SBUF=SenData; //SUBF接受/發送緩沖器
while(TI==0);
TI=0;
Flag=0;
}

}

}

void ser_int (void) interrupt 4 using 1
{

if(RI == 1) //RI接受中斷標志
{
RI = 0; //清除RI接受中斷標滾薯團志
ReData = SBUF; //SUBF接大橘受/發送緩沖器
SenData=ReData;
Flag=1;
}
}

試下這個程序,PC發什麼,它就回送什麼。

⑧ 幫忙看一個c語言編的串口通信程序

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char a,i;
uchar code table[]="I get ";

void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1);
}

void ser() interrupt 4
{

while(RI==0); //收去一個字元
a=SBUF;
RI=0;
if(a=='x')
for(i=0;i<6;i++) //發送部分,中斷要做的事情盡量放在中斷早派悄里
{
TI=0;
SBUF=table[i];
while(TI==0);
TI=0;
}
}

SBUF是可以直接定址的專用寄存器。物理上,它對應著兩個寄存器,即一個發送寄存器一個接收寄存器,CPU寫SBUF就是修改發送寄存陸渣器;讀SBUF就是讀接收寄存器。接收器是雙緩沖的,以避免在接收下一幀數據之前,CPU未能及時的響應接收器的中斷,沒有把上一幀的數據讀走而產羨氏生兩幀數據重疊的問題。對於發送器,為了保持最大的傳輸速率,一般不需要雙緩沖,因為發送時CPU是主動的,不會產生重疊問題。

⑨ 單片機C語言編程中串口通訊中斷與定時器0中斷

首先是你的延時函數裡面,不可以再進行設置TMOD

可以直接使用for循環語句的延時控制,雖然時間不是很精確,但不影響各個中斷的使用

還有你的串口中斷部分,這種寫法問題很多

發送數據以及接收數據租陪,都需要等待發送與接收完成的,否則數據會有錯誤,導致不能發送或接收

另外,IP TF0 TF1 沒必要特意加以控制,直接忽略即可
PCON=0最好寫成PCON=0x00,方便閱讀,也不容易出錯

給你改了一下弊哪蠢串口中斷部分

//串列通訊中斷4處理程序
void uart_int() interrupt 4
{
uchar i;

i=SBUF;//接收一位數據
while(!RI);//等待接收完成
RI=0;//置位接收中斷申請標志位

SBUF=i;//發送一位數據
while(!TI);//等待發送完成
TI=0;//置位發送申請標志位
}

//延時程序
void delay(uint d) //緩橘晶振11.0592MHz下1ms
{
for(;hs>0;hs--)
{ for(hk=200;hk>0;hk--); }
}

⑩ 51單片機串口通信c語言編程

#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int

sbit ring=P3^7;
sbit CASE1=P2^0;
sbit CASE2=P2^1;
sbit CASE3=P2^2;
sbit CASE4=P2^3;

uchar se=0,re=0;
uchar temp=0;

void wait(uint cnt)
{
while(--cnt);
}

//串口發送程序
void send(uchar se)
{
SBUF=se; //發送數據
while(TI == 0);
TI = 0;
}
//串口接收程序
uchar receive(void)
{
re=SBUF; //接收數據
while(RI==0);
RI=0;
return re;
}
//串口初始化
void sinti(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
EA = 1;
ES = 1;
}
void delay(int cnt)
{
while(--cnt);
}

//主程序
int main (void)
{
int i;
sinti(); //串口初始化程序
ring=1;
while(1)
{
while (1)
{
if(CASE1==0)
{
send('a');
ring=0;
break;
}
if(CASE2==0)
{
send('b');
ring=0;
break;
}
if(CASE3==0)
{
send('c');
ring=0;
break;
}
if(CASE4==0)
{
send('d');
ring=0;
break;
}
}
if(ring==0)
{
wait(60000);
ring=1;
}
for(i=0;i<10000;i++);
}
}
//串口中斷程序
void UART_SER (void) interrupt 4 //串列中斷服務程序
{

if(RI) //判斷是接收中斷產生
{
RI=0; //標志位清零
temp=SBUF;
}
if(TI) //如果是發送標志位,清零
TI=0;
}