嵌入式的程序设计题

嵌入式的程序设计题,第1张

#include<sys/socket.h> //提供socket数及数据结构

#include<string.h>

#include<unistd.h>

#include<signal.h>

#include<sys/ipc.h>

#include<errno.h>

#include<sys/shm.h>

#include<time.h>

#define PERM S_IRUSR|S_IWUSR

#define MYPORT 3490 #define BACKLOG 10

#define WELCOME "|----------Welcome to the chat room! ----------|" //宏定义,当客户端连接服务端时,想客户发送此欢迎字符串 //转换函数,将int类型转换成char *类型

void itoa(int i,char*string) {

int power,j j=i

for(power=1j>=10j/=10) power*=10

for(power>0power/=10){

*string++='0'+i/power i%=power }

*string='\0'}

//得到当前系统时间

void get_cur_time(char * time_str) {

time_t timep

struct tm *p_curtime

char *time_tmp

time_tmp=(char *)malloc(2) memset(time_tmp,0,2)

memset(time_str,0,20) time(&timep)

p_curtime = localtime(&timep) strcat(time_str," (")

itoa(p_curtime->tm_hour,time_tmp) strcat(time_str,time_tmp) strcat(time_str,":")

itoa(p_curtime->tm_min,time_tmp) strcat(time_str,time_tmp) strcat(time_str,":")

itoa(p_curtime->tm_sec,time_tmp) strcat(time_str,time_tmp) strcat(time_str,")")

free(time_tmp)}

//创建共享存储区

key_t shm_create() {

key_t shmid

//shmid = shmget(IPC_PRIVATE,1024,PERM)

if((shmid = shmget(IPC_PRIVATE,1024,PERM)) == -1){

fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno)) exit(1) }

return shmid}

//端口绑定函数,创建套接字,并绑定到指定端口

int bindPort(unsigned short int port) {

int sockfd

struct sockaddr_in my_addr

sockfd = socket(AF_INET,SOCK_STREAM,0)//创建基于流套接字

my_addr.sin_family = AF_INET//IPv4协议族

my_addr.sin_port = htons(port)//端口转换

my_addr.sin_addr.s_addr = INADDR_ANY

bzero(&(my_addr.sin_zero),0)

if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) == -1){

perror("bind")

exit(1) }

printf("bing success!\n")

return sockfd}

int main(int argc, char *argv[]) {

int sockfd,clientfd,sin_size,recvbytes//定义监听套接字、客户套接字

pid_t pid,ppid //定义父子线程标记变量

char *buf, *r_addr, *w_addr, *temp, *time_str//定义临时存储区

struct sockaddr_in their_addr //定义地址结构

key_t shmid

shmid = shm_create()//创建共享存储区

temp = (char *)malloc(255)

time_str=(char *)malloc(20)

sockfd = bindPort(MYPORT)//绑定端口

while(1){

if(listen(sockfd,BACKLOG) == -1)//在指定端口上监听 {

perror("listen")

exit(1) }

printf("listening......\n")

if((clientfd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)) == -1)//接收客户端连接 {

perror("accept")

exit(1) }

printf("accept from:%d\n",inet_ntoa(their_addr.sin_addr))

send(clientfd,WELCOME,strlen(WELCOME),0)//发送问候信息

buf = (char *)malloc(255)

ppid = fork()//创建子进程

if(ppid == 0) {

//printf("ppid=0\n")

pid = fork() //创建子进程

while(1){

{

if(pid >0) {

memset(buf,0,255)

if (strcmp(str_1, “88”) == 0||strcmp(str_1, “byebye”) == 0|| strcmp(str_1, “拜拜”) == 0)

{

Exit(0)

}//当发言者发出类似“88”、“byebye”、“再见”等信息时,能自动结束进程。

if((recvbytes=recv(clientfd,buf,255,0))<=0) {

perror("recv1")

close(clientfd)

raise(SIGKILL)

exit(1)

}

w_addr = shmat(shmid, 0, 0)

memset(w_addr, '\0', 1024)

strncpy(w_addr, buf, 1024)

get_cur_time(time_str)

strcat(buf,time_str)

printf(" %s\n",buf)

}

else if(pid == 0)

{

sleep(1)

r_addr = shmat(shmid, 0, 0)

if(strcmp(temp,r_addr) != 0)

{

strcpy(temp,r_addr)

get_cur_time(time_str)

strcat(r_addr,time_str)

if(send(clientfd,r_addr,strlen(r_addr),0)==-1) {

perror("send")

}

memset(r_addr,'\0',1024)

strcpy(r_addr,temp)

}

}

else

perror("fork")

}

}

}

printf("------------------------------\n")

free(buf)

close(sockfd)

close(clientfd)

return 0

}

//定时器3中断服务程序

void TIM3_IRQHandler(void)

{

if(TIM3->SR&0X0001)//溢出中断

{

LED1=!LED1

}

TIM3->SR&=~(1<<0)//清除中断标志位

}

//通用定时器中断初始化

//这里时钟选择为APB1的2倍,而APB1为36M

//arr:自动重装值。

//psc:时钟预分频数

//这里使用的是定时器3!

void Timerx_Init(u16 arr,u16 psc)

{

RCC->APB1ENR|=1<<1//TIM3时钟使能

TIM3->ARR=arr //设定计数器自动重装值//刚好1ms

TIM3->PSC=psc //预分频器7200,得到10Khz的计数时钟

//这两个东东要同时设置才可以使用中断

TIM3->DIER|=1<<0 //允许更新中断

TIM3->DIER|=1<<6 //允许触发中断

TIM3->CR1|=0x01 //使能定时器3

MY_NVIC_Init(1,3,TIM3_IRQChannel,2)//抢占1,子优先级3,组2

}

int main(void)

{

_init(72) //延时初始化

Init() //初始化与LED连接的硬件接口

Timerx_Init(5000,7199)//10Khz的计数频率,计数到5000为500ms

while(1)

{

}

}

1,使能GPIO和串口1的时钟。

2,设置串口波特率为115200.

3,设置串口数据宽度为8位

4,设置串口停止位为1位

5,设置串口无校验

6,设置串口无需硬件控制。

7,设置串口的模式

8,根据配置初始化串口。

9,串口使能。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11308487.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存