×

uTerm2-S:多仿真彩色RS232终端

消耗积分:2 | 格式:zip | 大小:0.29 MB | 2022-07-07

分享资料个

PCB图如下:
poYBAGK1NImAJ-QLAACtGjaHI2o847.jpg
poYBAGK1NIuAZVWFAAC6jPv_hdM286.jpg

描述

uTerm2-S:多仿真彩色RS232终端

* * 硬件概述 * *

uTerm2-S(独立微型 Term2)是一个易于构建的多仿真 RS232 终端,使用 ESP32-Wroom-32 模块和出色的 FabGL 库(http://www.fabglib.org)。此外,使用 ESP32 让您有机会通过 Arduino IDE 和 ESP32 内核以多种不同方式轻松使用 uTerm2-S。

这些uTerm2-S的主要规格:

RS232串口;

VGA输出;

串行 USB 适配器的“透明”端口(如uTerm-S中);

使用串行 USB 适配器进行 ESP32 编程的辅助串行端口;

RS232 和“透明”端口之间的 RTS/CTS 支持(如在uTerm-S中);

车载电源;

颜色、图形和声音功能(FabGL 库);

多语言键盘支持(FabGL 库);

各种终端仿真(FabGL 库);

用于键盘和鼠标的 PS/2 连接器;

用于外部扬声器的板载放大器。

在下图中,连接到普通 PC 扬声器的 uTerm2-S(以前的 PCB 版本):

 

这是最后一块板:

 

 

COM-USB2 (J3) 连接器(透明端口)

uTerm2-S 有一个用于 USB 串行适配器的“透明”端口(如 uTerm-S),因此您可以使用 XMODEM 与 PC 交换文件(运行支持 XMODEM 文件传输的终端仿真器),而uTerm2-S 正在使用中。

两种“混合”电源方案(USB 串行适配器不是由 USB 供电,而是由 uTerm2-S 供电,反之亦然)均由硬件管理,因此您无需担心。

在下图中,串行 USB 适配器通过电缆连接到透明 COM-USB2 (J3) 端口:

 

这允许在“同一”时间使用两个键盘和两个显示器(一个键盘和显示器直接连接到 uTerm2-S,另一个键盘和显示器在与串行 USB 连接的 PC 上的终端仿真器)。

请注意,COM-USB2 (J3) 端口支持 RTS/CTS 硬件握手,因此串行 USB 适配器上需要两个 RTS/CTS 信号。

在下图中,一个通用的基于 CP2102 的串行 USB 适配器连接了 RTS/CTS 信号:

 

下表显示了如何将串行 USB 适配器连接到 J3:

poYBAGK1NK6AQrP5AAEFuPQErvo839.jpg

注意:信号分配与 uTerm-S 的 SER-USB (J3) 连接器相同。

PRG-USB1 (J2) 连接器(编程端口)

PRG-USB1 (J2) 连接器用于使用串行 USB 适配器对 ESP32 进行编程(建议使用支持默认 921600 比特/秒上传速度的型号,如基于 CP2102 的适配器)。

两种“混合”电源方案(USB 串行适配器不是由 USB 供电,而是由 uTerm2-S 供电,反之亦然)均由硬件管理,因此您无需担心。

有关编程过程的更多信息,请参阅“如何对 ESP32 进行编程”段落。

SPK (J9) 连接器

SPK (J9) 连接器用于连接可选扬声器(4/16 欧姆)。我使用了一个打捞的 PC 扬声器。

其他连接器

其余的连接器是显而易见的。PS/2 KB (J5) 和 PS/2 MOUSE (J4) 用于 PS/2 键盘和可选的 PS/2 鼠标。请注意,许多 USB 键盘(以及 USB 鼠标)内部都有 PS/2 兼容芯片,因此可以与众所周知的“绿色适配器”一起使用:

 

 

VGA (J1) 连接器用于 VGA 显示器,RS232 (J8) 连接器是主机的 RS232 串行端口。最高速度为115200 bps(这是MAX232 RS232驱动器的最高速度)。

DC-IN (J2) 是电源输入连接器。建议使用 9V 1A 直流电源。

RTS-HS (SW3) 开关

uTerm2-S 具有 RTS/CTS 信号,用于在 RS232 串行端口 (J8) 连接器(用于主机)和 COM-USB2 (J3) 连接器(用于终端仿真软件的“透明端口”)之间PC),所以它可以用于文件交换。

为了清楚起见,下图显示了 uTerm2-S 的串行端口框图:

pYYBAGK1NL-AePUWAAByA06c9BU923.jpg

在 COM-USB2 (J3) 侧,如果 PC 侧的 RX 缓冲区已满,PC 上的终端仿真软件使用 RTS 信号将通信置于等待状态。CTS 信号是一个输入,如果主机端的输入缓冲区已满,则允许主机执行相同操作。由于 PC 通常比复古系统快得多,因此可以方便地将 RTS 信号设置为“始终准备好接受”状态(在 PC 端)。在这种情况下,RTS-HS 开关 (SW3) 用于打开或关闭 RTS 握手。

关闭时,连接到串行端口的主机将看到 RST 线始终处于活动状态(RTS 和 CTS 是活动的“低”信号)。这在某些情况下会很方便。

RTS-HS 开关对 CTS 信号没有影响。

第一个键 (SW2)

RST 键(SW2)用于复位 ESP32 模块。

DFLT 键 (SW1)

DFLT 键 (SW1) 用于将所有终端参数重置为默认值。要激活此功能,您必须按下 DFLT 键,并按住它直到复位完成,按下并松开 RST 键 (SW2) 以复位 uTerm2-S。

注意:必须在 AnsiTerminal 草图中启用 DFLT 键(请参阅“如何编程 ESP32(J2/PROG-USB1 连接器)”段落)才能使其工作。

* * 软件概述 * *

uTerm2-S 设计为使用 FabGL 库,因此您需要首先安装 Arduino IDE 和 ESP32 内核。

然后你必须安装 FabGL 库。因为周围有很多教程,所以我不会在这里提供更多关于如何设置“工具链”的详细信息(即参见 FabGL 站点上的演示和教程部分)。

如何对 ESP32 进行编程

uTerm2-S 可以使用 Arduino IDE 作为通用 ESP32 板进行编程(具有自动上传所需的威廉希尔官方网站 ):

 

您只需将 PRG-USB1 (J2) 连接器与串行 USB 适配器一起使用:

 

下表显示如何将串行 USB 适配器连接到 PRG-USB1 (J2):

poYBAGK1NNWATz1tAAEE2S9ARHY616.jpg

注意:您可以使用相同的适配器/电缆进行编程(通过 J2)和与透明端口(通过 J3)通信,因为 J2 和 J3 连接表具有兼容的信号分配。

要刷新终端固件,您必须从 FabGL 库的示例中打开 AnsiTerminal “草图”:

pYYBAGK1NOOAHWFKACSsBUO7QUs322.jpg

请记住首先更改包含以下内容的行:

#define USERESETPIN 0

至:

#define USERESETPIN 1

启用 DFLT 键:

poYBAGK1NOaAfMxmAAHfD_ySR6w273.png

现在您可以编译和刷新 AnsiTerminal 草图。

pYYBAGK1NPGANsMcACGv8-vPAtA488.jpg

注 1:不要在“流控制”终端设置面板上启用 HW RTS/CTS 握手,因为 HW 握手是为 COM-USB2 (J3)“透明”连接器保留的(请参阅“RTS-HS 开关”段),并且相关的 GPIO 不用于此。

注 2:最大终端串行速度不能超过 115200 bps。

游戏

在 FabGL 库的示例目录中,也有一些可以使用 uTerm2-S 运行的游戏。

这里是太空侵略者:

poYBAGK1NP-AHrR4ACGKjDILiaU939.jpg

和经典赛车:

pYYBAGK1NRKARD7bAC7WLnpMth4078.jpg

并且不要忘记连接扬声器!

* * 学分 * *

FabGL 库由 Fabrizio Di Vittorio ( http://www.fabglib.org ) 开发。

 

 

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'uTerm2-S:多仿真彩色RS232终端',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);