买个正点原子linux板子用,发现屏幕和正点原子stm32的屏幕不通用,另购买一块屏幕还是贵,思考如何通过不购买屏幕也可以体验它到显示。可以通过一根网线来解决
解决思路,linux开发板运行应用程序,使用网线将的数据通过网线传至笔记本电脑的屏幕,在window界面编写程序将图像显示出来。
所需工具:笔记本一台,一根网线,正点原子linux开发板
1.linux程序
1.打开linux的显存,将显存映射到到一个地址,通过此地址可以修改和观察显存数据,通过udp协议将数据传送至电脑端
编译使用虚拟机交叉编译,具体方法参考正点原子手册学习
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#define SERVER_PORT 8888 //定义端口号:(0-1024为保留端口号,最好不要用)
#define MAX_BUF_SIZE 1024*3
long ceshi ;
int ceshi1 = 0;
char buffer[MAX_BUF_SIZE];
char buffer1[MAX_BUF_SIZE];
#define display_width 1024
#define display_high 600
#define send_size 50+4
int sockfd; //socket描述符
struct sockaddr_in addr; //定义服务器起地址
void set_adress(int adress,unsigned char *temp)//adress 代表显存下标,buffer表传输的数值
{
temp[0] = adress >>24;
temp[1] = adress >>16;
temp[2] = adress >>8;
temp[3] = adress;
temp[0] = 55;
}
void send_date(int temp,int color) //只发送一个颜色
{
int n;
int i;
int repeat = 0;
int len;
struct sockaddr *appaddr;
len = sizeof(struct sockaddr_in);
//while(1)
{ /* 从键盘读入,写到服务端 */
#if 0
printf("Please input char:\n");
fgets(buffer1,MAX_BUF_SIZE,stdin);
#endif
i = 0;
//temp = y*display_width+x;
buffer[i] = (unsigned char)(temp/1000000%100);
i++;
buffer[i] = (unsigned char)(temp/10000%100);
i++;
buffer[i] = (unsigned char)(temp/100%100);
i++;
buffer[i] = (unsigned char)(temp%100);
i++;
buffer[i] = (unsigned char )((color>>8));
i++;
buffer[i] = (unsigned char )((color));
i++;
buffer[i] = 0;
appaddr = (struct sockaddr *)&addr;
sendto(sockfd,buffer,10,0,(struct sockaddr*)appaddr,len);
bzero(buffer,MAX_BUF_SIZE);
}
}
void send_date_1(int temp,int length,unsigned short *p) //发送一串颜色1024×2 个长度,使用2个字节作为行数
{
int n;
int i;
int j;
int k = 0;
int repeat = 0;
int color;
int len;
struct sockaddr *appaddr;
len = sizeof(struct sockaddr_in);
//while(1)
{ /* 从键盘读入,写到服务端 */
#if 0
printf("Please input char:\n");
fgets(buffer1,MAX_BUF_SIZE,stdin);
#endif
i = 0; //地址从0开始
//temp = ceshi++;
j = temp;
buffer[i] = (unsigned char)(temp/1000000%100);
i++;
buffer[i] = (unsigned char)(temp/10000%100);
i++;
buffer[i] = (unsigned char)(temp/100%100);
i++;
buffer[i] = (unsigned char)(temp%100);
i++;
buffer[i] = (unsigned char)(length>>8);
i++;
buffer[i] = (unsigned char)(length&0xff);
i++;
for(k = 0;k < length;k++)
{
color = p[j++];
buffer[i++] = (unsigned char )((color>>8));
buffer[i++] = (unsigned char )((color));
}
//buffer[i++] = 0;//结束符号
appaddr = (struct sockaddr *)&addr;
sendto(sockfd,buffer,i,0,(struct sockaddr*)appaddr,len);
//bzero(buffer,MAX_BUF_SIZE);
//sleep(1);
}
}
void draw_point(int x,int y,int color)
{
int n;
int i;
int repeat = 0;
int temp;
int len;
struct sockaddr *appaddr;
len = sizeof(struct sockaddr_in);
//while(1)
{ /* 从键盘读入,写到服务端 */
#if 0
printf("Please input char:\n"