标签存档: C++

路由器 DIY,加装液晶屏

嗯,这算是一个帖子引发的血案。之前在逛恩山的时候,看到一个帖子,《给tp-link wr941n增加一个液晶屏,散热片和USB口》,这就跨上了改造路由器的不归路。

先秀一下最终改造结果:

需要说明的是,改造路由器加装液晶屏,只能算是一个玩票的行为,实际意义不是特别大,成本相对路由器来说,也不低,所以只推荐喜欢折腾的人玩。

另外,这篇文章只介绍怎么去加装液晶屏,不涉及到加装 USB 口。

准备材料

要改造路由器,首先就需要去准备一个路由器,一般的路由器可不行。为了能在液晶屏是显示内容,需要有程序去控制液晶屏,而一般的路由器是不能运行自己的程序的,这就需要路由器可以刷机,可以刷 dd-wrt 或者 openwrt 等等的都可以。

我用的路由器是迅捷 fw300r,实惠,京东的价格在79左右浮动,比较便宜的另外一个好处就是折腾坏了不心疼,这篇文章的内容也是以 fw300r 为基础而写。我买的 fw300r 是 v2 版本,配置为 4M Flash 和 32M RAM。

加装液晶屏,再需要的当然就是液晶屏了。我这里选择的是 12864 液晶,分辨率是 128×64。

需要注意的是,一般买到的 12864 的接口都是并行或者SPI,并不能直接连接在路由器上使用。因此,在选购液晶的时候,要注意选择带 TTL 或者 UART 支持的,要不然还得加个单片机在路由器和液晶屏之间。如果是在淘宝上购买,可以找串口支持的 12864 液晶,但是特别注意,SPI 串口不是我们这里要用的串口,最好和卖家沟通之后再买。

液晶屏的电压也需要注意,路由器的 TTL 针脚一般也带电源输出,但是电压只有 3.3v,如果选购的液晶屏驱动电压是 5v 的话,那就需要安装额外的电源了。

液晶屏建议选择小屏,路由器本身体积不大,如果选择大屏的话,有可能装不下,要把液晶屏放在外面。

另外,路由器上需要加装 TTL 针,液晶屏一般也不带针脚,这就需要有电烙铁来焊针脚。如果不是买原厂的路由器,而是在淘宝上买那些已经被卖家改装过的,那很可能就是已经装了 TTL 针脚了。如果打算这个液晶屏就只在路由器上用了,也可以不用给液晶屏焊针脚,直接把线焊上去就行了。

如果路由器和液晶屏都有针脚,那就还需要杜邦线来连接,这个可以在买液晶屏的时候叫卖家送三根。

材料和成本清单:

  • 路由器 fw300r,79元
  • 12864 液晶屏,不同规格价格可能会在 45-60 元之间
  • 杜邦线,4根,0.8元不到,可以叫卖家送⋯⋯
  • 单排针,0.2元
  • 焊接设备,最初级的一套在 20 元左右
  • 如果要在电脑上测试的话,USB to TTL 是不可少的,12 元左右,要选择带有 3.3v 电源输出的
  • 如果可能的话,备一个万用表来测试插针是否焊接正确,以及从路由器输出的电压是否正确,一般 30 元左右

继续阅读 »

Windows Mobile 中启动外部应用程序

Windows Mobile下面Java一直没有比较好的模拟器,用了一段时间的JMM最新版,觉得不错,但是有些程序还是不能运行,就去下了个JBed,但是在JBed中安装程序时会搜索卡,感觉比较费时,用Resco Explorer用JBed带参数打开时,又安装不了,因为需要加额外的参数-ginstall,Resco Explorer不支持。

另外一种方法就是把 .jar 文件的关联改到JBed,不过平时主要用的JMM,不想改掉关联,所以想着写个程序,作为代理,在Resco Explorer里把 .jar 文件的路径传给这个代理,再通过这个程序带参数启动 JBed 来安装。

要做到这些,就需要在这个代理中启动外部应用程序,第一次写Windows Mobile下面的程序,不过都是微软一家人,也不是麻烦,在Google上找了资料,发现可以用 ShellExecuteEx 来启动外部应用程序,然后就开写了。

程序的主要代码就一段,功能就是接受参数,启动 JBed。

wchar_t* param;
param = (wchar_t*) LocalAlloc(LPTR, 255);
wsprintf(param, _T(“-ginstall \”file:\\%s\””), lpCmdLine);
SHELLEXECUTEINFO execInfo;
ZeroMemory(&execInfo, sizeof(execInfo));
execInfo.cbSize = sizeof(execInfo);
execInfo.lpFile = _T(“\\Storage Card\\J\\jbed.exe”);
execInfo.lpParameters = param;
execInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
execInfo.lpVerb = _T(“open”);
ShellExecuteEx(&execInfo);

因为觉得用 .NET 的话,程序的启动速度太慢,所以就用了 C++ 来写。

[C] 贪心算法

去图书馆借了本算法与数据结构,第一节里有个贪心算法,回寝室便试了下,不想碰到了一些问题。

例1.1 快速送达疫苗

已 知有邻近的五个村子发生了疫情,见图1-1。我们要用汽车快速地将疫苗送达到5个村子,目标是寻找一条耗时最少的路线。

画图不方便就不放 了:)代码里s数组存放的就是各个村子之间的距离。

我用C写的代码如下:

#include <stdio.h>

int s[5][5]={

{0,1,2,7,5},

{1,0,4,4,3},

{2,4,0,1,2},

{7,4,1,0,3},

{5,3,2,3,0},

};

int visited[5]={0};

int mindis(int start)

{

int i;

int d=10;

int n;

for(i=0;i<5;i++)

{

if(visited[i]==0&&s[start][i]<d)

{

d=s[start][i];

n=i;

}

}

visited[n]=1;

return n;

}

void greedy(int start)

{

int cost;

int i;

int n;

int ss;

ss=start-1;

printf(“%d”,start);

visited[ss]=1;

for(i=0;i<4;i++)

{

n=mindis(ss);

cost+=s[ss][n];

printf(“-%d”,n+1);

ss=n;

}

cost+=s[ss][start-1];

printf(“-%d\ncost is:%d\n”,start,cost);

}

int main()

{

greedy(1);

return 0;

}

在 写时,调试了好几次,再查了一下书才真正搞定。

1. 数组的初始化。

在初始化村子距离数组时,我先用的是这样语句:

int s[5][5]={

(0,1,2,7,5),

(1,0,4,4,3),

(2,4,0,1,2),

(7,4,1,0,3),

(5,3,2,3,0),

};

结 果弄了半天得不到正确结果,把小括号改成花括号后才解决了问题。数组初始化时用花括号是按行初始化。

2. 数组下标起始值

数 组的下标起始值应为0,在开始时我却没有想到,在mail()里传过来的1就直接用进去了,结果是输出里有一个超大的值。

当然了,我写的这 个并不好,以上的问题也只是我个人的见解,如果有什么错误还望指点一二:)

[C] 冒泡排序

冒泡排序法:)记得在一本三级A类教程上看过怎么优化的,现在又给忘了,只写了这么个东东。

#include <stdio.h>

#define N 100

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

{

int a[N];

int i,j,temp;

for(i=0;i<N;i++) a[i]=rand();

printf(“start: %d\n”,st=(unsigned)time(NULL));

for(i=0;i<N;i++)

{

for(j=i;j<N-1;j++)

{

if(a[j]>a[j+1])

{

temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;

}

}

}

for(i=0;i<N;i++) printf(“%d “,a[i]);

printf(“\n”);

return 0;

}