This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
在 UART 端口2 Rx 引脚上接收字符时遇到问题。 我已将(硬件)引脚 PB1 (Tx ox UART1)连接到 PD6 (UART2的 Rx)。 我成功地从 UART1端口传输数据、但无法在 UART 端口2 Rx 引脚上接收任何数据。 我也在发布代码。 在这方面,即使是小幅帮助也是值得赞赏的。
#include #include #include #include "inc/hw_memmap.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #include "driverlib/interrupts.intruarts/include" #include "h/intruarts.h" // // //此函数将 UART1设置为用于 launchpad //和 GPS 模块之间的通信。 //// ***************** void ConfigureUART1 (void) { // //启用用于 UART1引脚的 GPIO 端口 B。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); // //为端口 B0和 B1上的 UART1功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PB0_U1RX); GPIOPinConfigure (GPIO_PB1_U1TX); // //启用 UART1,以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART1); // //使用内部16MHz 振荡器作为 UART 时钟源。 //与 SIR 核对 // UARTClockSourceSet (UART1_base、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1); // //初始化 UART1。 // //UARTStdioConfig (1、9600、16000000); UARTClockSourceSet (UART1_base、UART_CLOCK_PIOSC); UARTConfigSetExpClk (UART1_base、UART_CLOCK_PIOSC、9600、UART_CONFIG_PAR_ZERO); UARTFIFOEnable (UART1_BASE); } //********* // //此函数将 UART2设置为用于 UART1和 UART2之间的通信。 //// ***************** void ConfigureUART2 (void) { // //启用用于 UART2引脚的 GPIO 端口 D。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); // //为端口 D6和 D7上的 UART2功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PD6_U2RX); GPIOPinConfigure (GPIO_PD7_U2TX); // //启用 UART1,以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART2); // //使用内部16MHz 振荡器作为 UART 时钟源。 //与 SIR 核对 // UARTClockSourceSet (UART2_base、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_PORTD_base、GPIO_PIN_6 | GPIO_PIN_7); // //初始化 UART1。 // //UARTStdioConfig (1、9600、16000000); UARTClockSourceSet (UART2_base、UART_CLOCK_PIOSC); UARTConfigSetExpClk (UART2_base、UART_CLOCK_PIOSC、9600、UART_CONFIG_PAR_ZERO); UARTFIFOEnable (UART2_base); } //********* // //此函数使用简单的轮询方法提供1秒延迟。 //// ***************** void SimpleDelay (void) { // //延迟周期1秒 // SysCtlDelay (16000000 / 3); } //********* // //向 UART0发送字符串。 //// ***************** void UART1Send (const uint8_t * pui8Buffer、uint32_t ui32Count) { // //循环,同时有更多字符要发送。 // while (ui32Count---) { // //将下一个字符写入 UART。 // while (!UARTSpaceAvail (UART1_base)){ //等待 Tx FIFO 中的空间可用。 UARTFIFODisable (UART1_BASE); UARTFIFOEnable (UART1_BASE); } UARTCharPut (UART1_base、* pui8Buffer++); // //打开 LED (绿色)。 // GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、GPIO_PIN_3); SimpleDelay(); //关闭 LED (绿色)。 // GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_3、0x00); // //打开 LED (蓝色)。 // GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、GPIO_PIN_2); SimpleDelay(); // //关闭 LED (蓝色)。 // GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0x00); } } //********* // //针对闪烁 LED 的配置。 //// ***************** void ConfigureLED (void){ // //启用用于板载 LED 的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); // //检查是否启用了外设访问。 // while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOF)) { } // //为 LED 启用 GPIO 引脚(PF3、PF2、PF1)。 //将方向设置为输出,并启用 GPIO //用于数字功能的引脚。 // GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_3); GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_2); GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1); } //********* // //主要功能 // //********* int main (void) { ConfigureLED(); 配置 UART1 (); 配置 UART2 (); while (true){ uint32_t rec = 0; UART1Send ((uint8_t *)"ABCDEFGHKLIJMNOP"、16); SimpleDelay(); while (!UARTCharsAvail (UART2_base)){ // //等待 UART2的接收 FIFO 中出现一个字符。 // } // //提取字符。 根据、"REc"将为 true 或 false //接收 FIFO 中存在字符。 // REC = UARTCharGetNonBlocking (UART2_base); if (rec){ // //打开红色 LED。 // GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、GPIO_PIN_1); SimpleDelay(); // //关闭红色 LED。 // GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、0x00); SimpleDelay(); } }
[引用 user="Suyash Bagad"]在这方面,即使是小的帮助也将不胜感激。
事实上、这种"小帮助"是我的专长。 BTW -非常出色的帖子-格式良好且清晰呈现。 而且-刚刚注意到-这是您的"第一篇帖子"-非常出色!
这里有几个问题/意见: (和赤裸裸的意见)
同样、您的职位是"有史以来最好的"首次发布职位的有力候选人! 做得很好! (因此应该有一个"类似"的说法-但该奖项已被删除-并且没有任何好的/好的理由!)
我可以提供一些帮助。 在设置 UART1和 UART2时调用函数 UARTConfigSetExpClk 的第二个参数 是时钟速率、而不是时钟源编号。 它应如下所示:
UARTConfigSetExpClk (UART2_base、16000000、9600、UART_CONFIG_PAR_ZERO);
这将使波特率达到9600。
您的代码在 UART1上发送16个字符、每个字符之间每次发送一个字符、延迟为1秒。 然后从 UART2的 FIFO 读取一个字符、延迟2秒、重复在 UART1上发送16个字符。 这是您打算做的事情吗? UART2上的 FIFO 将第二次溢出。
好的、还有两个建议。 首先、您没有设置字符长度。 默认情况下、它仅为5位。 如果与 GPS 通信、您可能需要以下内容:
UARTConfigSetExpClk (UART2_base、16000000、9600、(UART_CONFIG_WLEN_8 |UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));
接下来、必须先启用引脚端口和 UART、然后再将引脚类型设置为 UART。
//启用用于 UART2引脚的 GPIO 端口 D。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); // //启用 UART1,以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART2); // //为端口 D6和 D7上的 UART2功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PD6_U2RX); GPIOPinConfigure (GPIO_PD7_U2TX);
话虽如此、我建议您仔细查看一些有关外设初始化方式的示例代码。 有时、函数调用顺序等简单的东西很重要。
塞缪尔·克莱门斯(用马克·吐温的笔名写的)年轻时,因担任河船船长而接受采访时,他被问及他是否知道所有的沙条都在哪里。 他立即回答"不、但我知道他们不在哪里"。 使用成熟的示例代码就像我们知道"沙条不知道"的地方一样。
虽然 Twain 先生可能"避开了沙条"-难道这里的人不应该认识到"甚至是示例代码"有时会忽略(必要/有用)函数调用吗?
提供的示例(上面的帖子)没有提到"外设就绪"的"有用调用"、而"并非总是"需要、这种"防御性编码"会起到"合理"的作用! (避免使用砂条。)
上述"笔记本"的内容是:"引脚类型"-但列出了"引脚配置"-假设"引脚类型"遵循"引脚配置"-可以将其视为"通用规则"吗? (团队/我发现、尽管"文档组合"很多、但却没有提及此规则。)
请注意-(如早期回答帖子中所述) PDL "很难避免"、最重要的是"外设初始化"-邀请海报进入高悬崖。 (可提供"河景"!)
非常感谢 CB1_MOBILE 和所有其他人的所有建议!
您在建议可疑传输时、正是正确的。 我使用示波器检查了传输引脚、除了恒定3.5-3.6V (APPx)之外什么都没有。
回到基础知识、我尝试编写一个更简单的代码来测试 UART 传输。 我已经配置了 UART0和 UART2端口、并且我正在将(稍作修改) UART0处接收到的任何字符再次回显到 UART0 (因此、如果我按"A"并从 PC 发送到 UART0、我会在 PC 上的串行监视器上看到"B")。 现在、我还将同一个字符回显到 UART2端口(即从 UART2 Tx 引脚(PD7)传输"A")、并检查示波器上同一引脚(PD7)上的信号、再次获得恒定的"0"电压。
最后、UART0端口工作正常、但 UART2 (或 UART1、我已经尝试过这两种)端口不工作。 请帮我调试这个、我从昨天开始就一直在努力!
#include #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/sysctal.h" #include "driverlib/uart/uart.h" #include "SysConfigCtl(SysClock_map.h" )| 配置 GPIOSYSC_0 (SysCtl_sysctl);USTRF_0_US_0_UST_GPIOSYSC_0 (SysCtl_USTRF_0_0_UST_GPIO0_USTRO) GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、115200、 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); SysCtlPeripheralEnable (SYSCTL_PERIPH_UART2); SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOD); GPIOConfigure (GPIO_PD6_U2RX);GPTOL_PINTX_Configure GPIOPinTypeUART (GPIO_PORTD_base、GPIO_PIN_6 | GPIO_PIN_7); UARTConfigSetExpClk (UART2_base、SysCtlClockGet ()、9600、 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); } int main (void){ ConfigureUART (); UARTCharPut (UART0_BASE、'E'); UARTCharPut (UART0_BASE、'n'); UARTCharPut (UART0_BASE、"t"); UARTCharPut (UART0_BASE、"e"); UARTCharPut (UART0_BASE、 'R'); UARTCharPut (UART0_BASE、'); UARTCharPut (UART0_BASE、'T'); UARTCharPut (UART0_BASE、'e'); UARTCharPut (UART0_BASE、'x'); UARTCharPut (UART0_BASE、 "T"); UARTCharPut (UART0_BASE、":"); UARTCharPut (UART0_BASE、"); UARTCharPut (UART2_base、'a'); while (1) { if (UARTCharsAvail (UART0_BASE)){ uint32_t recd = 0; recd = UARTCharGet (UART0_BASE); UARTCharPut (UART0_BASE、recd+1); UART2_BASE (UARTChart) recd); } } }
您好、Suyash、
您还发表了另一篇经过深思熟虑、格式良好且详细的文章-这也是太棒了! (在图表上表现良好-尤其是对于一个"如此新"的人而言。)
这里还有一个-可能"错过了事实"、PD7是一个"Devil Pin"-应该避免-除非您准备"将注意力从您的"中心任务转移到另一个任务!" (这是严重违反亲吻-无论公司/我喜欢什么成功-最常源于"亲吻聚焦和持续努力!" (即、我们"展示"-并将"激光聚焦"置于"手头任务"的最小元素中!)
请"避免"使用 PD7和 PF0 -我将在您解决 UART 问题后进行解释。 (这种偏离您的中心任务!)
选择不包含" Devil 引脚"的 UART。
请注意、"仅"UART0 "享受"到外部(主要是 USB)世界的电平转换(到 USB)连接。 我相信您正在"在两个 MCU UART 之间"传输数据、这样可以避免此问题、但您仍可能会挑战您在任何非 UART0端口"识别数据"的能力...
我之前没有看到以下内容-您能否进一步了解详情?
[引用 user="Suyash Bagad">我正在将 UART0处接收到的任何字符再次回显到 UART0... 现在、我还将同一个字符回显到 UART2端口(即从 UART2 Tx 引脚(PD7)传输"A")[/QUERP]
请帮助我自己(和他人)了解-哪个端口和引脚(曾)接收您 的"UART2 TX (PD7)输出?" 这种明确程度是必要的,但却是不存在的。 和-正如我之前提到的、应该避免使用"PD7是一个 Devil 引脚"。 (偏离我们的关键路径!)
通过选择另一个 UART 端口(无 Devil 引脚)、我们(仍然)需要知道您 正在连接的"方式、内容和位置"! (请提供-就像您在第一个出色的帖子上所做的那样:(例如、PAX 至 PBY 等) 这将证明非常有用。 再次查看您的报价(突出显示部分)-我们不知道该传输的目的地! (“A”正在去某处!) 这很重要-不是吗?
缓慢、 稳定、专注、 每次一小部分任务-是您的推荐流程。 (这就是我通过 Tech FiRM Public 的方式)
我要进一步赞扬你"打破千年准则"( 始终且仅限于)作出回应-"他们有(他们认为的)近乎完美的答案/评论。 这样就会让"其他方""在风中摇摆"-永远不知道您:a)已收到我们的请求;b)不知道如何响应;c)在我们的请求上很难工作;或 d)已放弃! 这些"替代含义"都不会对您有利/有利-这是不是吗?
更好的是-"尊敬的客户-收到并根据您的请求"努力工作"。 将以 x 小时/天/周/千年等的次数返回给您。" 至少这是"某件事"-我们注意到、您今天早些时候也曾写过类似的-这是为(其他)千禧一代提供的-他们可能"在这条线程上漫步"。
尊敬的 CB1_MOBILE (1830783),我很抱歉没有回复,是的,我正在努力查看您和他人的建议是否有效。
因此、我尝试使用 UART1、因为引脚 PD7似乎是"邪恶"。 我的最终目标是从 GPS 模块读取数据(通过向 SIM808发送适当的 AT 命令)、并在计算机的串行控制台上查看数据。 下面的简单代码等待在 UART0 Rx 端口读取字符、如果它找到任何内容(例如、从计算机到通过 USB 连接器的 Launchpad 的字符"A")、它应该回显接收到的字符的修改版本(即"a"+ 1 = 66 ="B")、 这可以在串行监视器上看到。 此外、我从计算机发送到 UART0的字符、与我从 UART1的 Tx 引脚传输的字符相同、用于将其发送到 SIM808模块。
请帮帮我。
硬件连接:
1) 1)通过 USB COD 将计算机连接到 TM4C123GXL。 (即默认情况下 launchpad 上的 UART0)
2)引脚 PB0 (launchpad 上 UART1的 Rx)连接到 SIMM808 GSM-GPS 模块的 Tx。
3)引脚 PB1 (launchpad 上 UART1的 Tx)到 SIMM808 GSM-GPS 模块的 Rx。
4)两块电路板上的接地短路。
5) 5)在 PB0和 PB1引脚端放置12K 电阻器。
示波器结果:
在引脚 PB0和 PB1上、恒定电压(约为3V)、但只要我持续按下键盘上的某些键、PB0和 PB1上的电压电平就会脉冲下降并再次上升。 我附上示波器的图片。
:
代码:
#include #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" void ConfigureUART (){ SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); SysCtlPeripheralEnable (SYSCTL_Periph_UART0); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、115200、 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); SysCtlPeripheralEnable (SYSCTL_Periph_UART1); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); GPIOPinConfigure (GPIO_PB0_U1RX); GPIOPinConfigure (GPIO_PB1_U1TX); GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk (UART1_base、SysCtlClockGet ()、9600、 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); } int main (void){ ConfigureUART(); UARTCharPut (UART0_BASE、'E'); UARTCharPut (UART0_BASE、"n"); UARTCharPut (UART0_BASE、"t"); UARTCharPut (UART0_BASE、"e"); UARTCharPut (UART0_BASE、"r"); UARTCharPut (UART0_BASE、'); UARTCharPut (UART0_BASE、"T"); UARTCharPut (UART0_BASE、"e"); UARTCharPut (UART0_BASE、"x"); UARTCharPut (UART0_BASE、"t"); UARTCharPut (UART0_BASE、":"); UARTCharPut (UART0_BASE、'); UARTCharPut (UART1_BASE、'A'); UARTCharPut (UART1_BASE、"T"); while (1) { if (UARTCharsAvail (UART0_BASE)){ uint32_t recd = 0; RID = UARTCharGet (UART0_BASE); UARTCharPut (UART0_BASE、RHD+1); UARTCharPut (UART1_base、recd); } }
我知道您的"使命"是能够"命令/控制"您的 GSM 模块。 然而,这一旅程由 "许多步骤"组成。 您对 GSM 模块的介绍可能会使"新问题"发挥作用、从而"打破 kiss 的影响"、这是公司/我发现的关键错误!
现在、你已经被"PD7 (魔鬼针)""蛇头"所取代-虽然"不是"那么邪恶-你的新 PB0和 PB1都表现为(可能)"麻烦的针脚!" 很久以前-供应商代理放置了"鼠疫-抗议者" R9、R10、使其"将 PB0与 PD6相连"、将 PB1与 PD7相连。 如果您的电路板是"LPAD"-并且 PD6或 PD7应该配置为 GPIO 输出-破坏性的"引脚争用"就到了您的家门口。 如果可能、请移除 R9和 R10、以免他们再制造邪恶... (实际上、我应该已经在"123 LPAD 可疑引脚"列表中添加了 PB0/PB1。)
您的最新代码受到供应商产品的启发、避免了使用"外设就绪"检查。 虽然不是(总是)需要----这种"防御做法"是"最佳做法"----但应予以采用。 您对 PDL 的阅读将显示"per. RDY"函数。 (您在其中"循环"、确保"刚刚启用"的外设已完成其保留。)
Plz Standby -午夜对我来说-必须确定代表您的"安全 UART"的易用性...
和上一步:我将列出那些支持 UART 的端口/引脚-它们是"安全的"-和-出现在"4C'123 LPAD 接头"上-以简化连接:
我从 LPAD 手册 Pgs 中的 w/中收集了这些数据。 9-11. 请注意、PE0、1会出现在不同的接头上、从而导致互连"混乱"。
总之、在您能够积极验证"非 UART_0性能!"的正确性之前、我会避免引入 GSM! 如果您要获取(再次称为"求和、借用(合法)获取"CMOS 到 USB 转换器")、则可以节省大量时间和精力、以便您可以"直接将" PC 连接到 LPAD 的"非 UART_0" UART 端口。
回答已完成-请"幽默我"-现在请避免使用 GSM。 (现在03:15 CST 美国-狗猫"战斗"让我感到敬畏-他们和我现在都在"日出"之前完成了。)
请注意我的列表 "Devil & otherwise suspect - ports/pins!"
我还准备了一个 (可能)出现在 LPAD 接头上的"安全 UART 端口"列表-使互连"快速/简单"。 (我的互连类型...)
并添加(被遗忘)"检查外设就绪"- 我们必须确保减少(理想情况下、识别和消除)故障的"所有途径"...
对您来说很好-很高兴您坚持下去。
请注意、有(几个)"类型"的"USB 转串行"转换器。 此类"串行转换器"可能包含"USB 转 RS23"-这可能会损坏您的 MCU! 请注意我的语言(之前)"USB 转 CMOS"-它最好地描述了一个"MCU 友好型-无损" USB 转换器。
祝贺您的成功-感谢您在此处支付"已解决"(支付部分费用-不多)帐单(保持一些我们喜欢 的"白炽灯"亮起/亮起)...
如果您描述最终选择的"Whise" UART 以及"What you changed - code wise (您更改了什么-代码明智)"以获得"Working Now status!"、则会对其他人有用。
此外、您还撰写了"优秀系列文章"-深思熟虑和详细-清晰地描述了您的问题-代码易于阅读(即格式化)-非常适合新的(甚至是普通的)海报...
对于与我一样的问题,无论谁陷入同一个问题,请注意:
1)如 CB1_MOBILE 所述 、PD7和 PF0确实是"邪恶的"、如果有选项、请始终选择 UART3、4、5、7端口中的任何一个。
2) 2)对于我来说、UART3、4运行良好、5和7也可以、但我尚未检查它们。
3) 3)这是最重要的结论:如果您正在寻找从 UART 端口到示波器的"信号"、请不要担心每次接收或传输字符时都会出现尖峰。 我已经花了60个小时担心这个问题、直到我使用串行转 USB (请记住、TTL 电平转换器 RS232会破坏您的板、因为它在12V 电平下工作)检查了我的端口。 因此、我正在调试示波器问题以找到问题、我不确定、但示波器的采样或配置可能存在一些问题。
无论如何、我希望在几天内完成与 GSM 的沟通、并且再次期待您将来也能提供所有帮助! 来自印度的爱!
最后、示波器上每次传输或接收的信号图片、是的、它们是尖峰、不是预期的数字信号、但您的 UART 没有什么问题! 谢谢!
出色-在短时间内、您将(可能)"运行此论坛"。 (但避免"补充他人"(此处为一个"SPI 挑战")对象...)
您的代码-它是否(完全)-从您今天早上早些时候的帖子中更改? (12月12日:54日、23日)