[{"data":1,"prerenderedAt":1156},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fat-commands":116,"\u002Fguides\u002Fat-commands-surround":1151},[4,27,53,74,108,112],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,22],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":23,"path":24,"stem":25},"Example app and development","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F4.development",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Guides","i-lucide-book-open","\u002Fguides","2.guides",[33,37,41,45,49],{"title":34,"path":35,"stem":36},"JavaScript API","\u002Fguides\u002Fjavascript-api","2.guides\u002F1.javascript-api",{"title":38,"path":39,"stem":40},"AT commands, exchange and CMUX","\u002Fguides\u002Fat-commands","2.guides\u002F2.at-commands",{"title":42,"path":43,"stem":44},"Rust","\u002Fguides\u002Frust","2.guides\u002F3.rust",{"title":46,"path":47,"stem":48},"Permissions","\u002Fguides\u002Fpermissions","2.guides\u002F4.permissions",{"title":50,"path":51,"stem":52},"Parsers","\u002Fguides\u002Fparsers","2.guides\u002F5.parsers",{"title":54,"icon":55,"path":56,"stem":57,"children":58,"page":26},"API reference","i-lucide-file-code","\u002Freference","3.reference",[59,63,67,71],{"title":60,"path":61,"stem":62},"SerialPort","\u002Freference\u002Fserial-port","3.reference\u002F1.serial-port",{"title":64,"path":65,"stem":66},"Types","\u002Freference\u002Ftypes","3.reference\u002F2.types",{"title":68,"path":69,"stem":70},"Tauri commands","\u002Freference\u002Fcommands","3.reference\u002F3.commands",{"title":46,"path":72,"stem":73},"\u002Freference\u002Fpermissions","3.reference\u002F4.permissions",{"title":75,"icon":76,"path":77,"stem":78,"children":79,"page":26},"Platforms","i-lucide-monitor-smartphone","\u002Fplatforms","4.platforms",[80,84,88,92,96,100,104],{"title":81,"path":82,"stem":83},"Overview","\u002Fplatforms\u002Foverview","4.platforms\u002F1.overview",{"title":85,"path":86,"stem":87},"Desktop","\u002Fplatforms\u002Fdesktop","4.platforms\u002F2.desktop",{"title":89,"path":90,"stem":91},"Android (USB)","\u002Fplatforms\u002Fandroid","4.platforms\u002F3.android",{"title":93,"path":94,"stem":95},"iOS","\u002Fplatforms\u002Fios","4.platforms\u002F4.ios",{"title":97,"path":98,"stem":99},"Serial over TCP","\u002Fplatforms\u002Ftcp","4.platforms\u002F5.tcp",{"title":101,"path":102,"stem":103},"Bluetooth LE (BLE)","\u002Fplatforms\u002Fble","4.platforms\u002F6.ble",{"title":105,"path":106,"stem":107},"DTR \u002F RTS on open","\u002Fplatforms\u002Fdtr-rts","4.platforms\u002F7.dtr-rts",{"title":109,"path":110,"stem":111},"Migration guide","\u002Fmigration","5.migration",{"title":113,"path":114,"stem":115},"Changelog","\u002Fchangelog","9.changelog",{"id":117,"title":38,"body":118,"description":1144,"extension":1145,"generated":26,"links":1146,"meta":1147,"navigation":1148,"path":39,"seo":1149,"stem":40,"__hash__":1150},"docs\u002F2.guides\u002F2.at-commands.md",{"type":119,"value":120,"toc":1134},"minimark",[121,145,151,228,266,299,342,381,385,493,503,518,522,531,618,642,648,657,719,748,752,775,779,786,899,903,910,1032,1127,1130],[122,123,124,125,129,130,129,133,136,137,140,141,144],"p",{},"For modems and other request\u002Fresponse devices the plugin has a native\ntransaction queue: every ",[126,127,128],"code",{},"exchange()",", ",[126,131,132],{},"sendAt()",[126,134,135],{},"sendAtPhases()"," and\n",[126,138,139],{},"sendSmsPdu()"," call waits its turn, writes, and resolves when the reply is\ncomplete. Concurrent calls never interleave on the wire, and a ",[126,142,143],{},"watch()"," can stay\nactive the whole time to receive unsolicited lines.",[146,147,149],"h2",{"id":148},"sendat",[126,150,132],{},[152,153,158],"pre",{"className":154,"code":155,"language":156,"meta":157,"style":157},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const r = await port.sendAt(\"AT+CSQ\");\n\u002F\u002F r.status: \"ok\" | \"error\" | \"cme\" | \"cms\" | \"unknown\"\n\u002F\u002F r.lines:  [\"AT+CSQ\", \"+CSQ: 27,0\", \"OK\"]\n\u002F\u002F r.solicitedBody: [\"+CSQ: 27,0\"]   r.urcLines: []   r.raw: Uint8Array\n","ts","",[126,159,160,209,216,222],{"__ignoreMap":157},[161,162,165,169,173,177,181,184,187,191,194,197,201,203,206],"span",{"class":163,"line":164},"line",1,[161,166,168],{"class":167},"spNyl","const",[161,170,172],{"class":171},"sTEyZ"," r ",[161,174,176],{"class":175},"sMK4o","=",[161,178,180],{"class":179},"s7zQu"," await",[161,182,183],{"class":171}," port",[161,185,186],{"class":175},".",[161,188,190],{"class":189},"s2Zo4","sendAt",[161,192,193],{"class":171},"(",[161,195,196],{"class":175},"\"",[161,198,200],{"class":199},"sfazB","AT+CSQ",[161,202,196],{"class":175},[161,204,205],{"class":171},")",[161,207,208],{"class":175},";\n",[161,210,212],{"class":163,"line":211},2,[161,213,215],{"class":214},"sHwdD","\u002F\u002F r.status: \"ok\" | \"error\" | \"cme\" | \"cms\" | \"unknown\"\n",[161,217,219],{"class":163,"line":218},3,[161,220,221],{"class":214},"\u002F\u002F r.lines:  [\"AT+CSQ\", \"+CSQ: 27,0\", \"OK\"]\n",[161,223,225],{"class":163,"line":224},4,[161,226,227],{"class":214},"\u002F\u002F r.solicitedBody: [\"+CSQ: 27,0\"]   r.urcLines: []   r.raw: Uint8Array\n",[122,229,230,231,129,234,237,238,129,241,129,244,129,247,129,250,237,253,129,256,129,259,262,263,265],{},"A command is complete when its final result line arrives: ",[126,232,233],{},"OK",[126,235,236],{},"ERROR",",\n",[126,239,240],{},"+CME ERROR: n",[126,242,243],{},"+CMS ERROR: n",[126,245,246],{},"NO CARRIER",[126,248,249],{},"BUSY",[126,251,252],{},"NO ANSWER",[126,254,255],{},"NO DIALTONE",[126,257,258],{},"SEND OK",[126,260,261],{},"SEND FAIL",". URCs that arrive in the same read (before\nthe echo, inside the reply, or right after ",[126,264,233],{},") are reported separately and do\nnot end the command early.",[122,267,268,271,272,129,275,129,278,129,281,129,284,237,287,129,290,129,293,129,296,186],{},[126,269,270],{},"AtCommandResult",": ",[126,273,274],{},"command",[126,276,277],{},"response",[126,279,280],{},"status",[126,282,283],{},"lines",[126,285,286],{},"solicitedBody",[126,288,289],{},"urcLines",[126,291,292],{},"matched",[126,294,295],{},"timedOut",[126,297,298],{},"raw",[122,300,301,304,305,129,308,311,312,315,316,319,320,323,324,129,327,129,330,237,333,129,336,129,339,186],{},[126,302,303],{},"AtCommandOptions"," (per call): ",[126,306,307],{},"timeoutMs",[126,309,310],{},"resultFormat"," (",[126,313,314],{},"\"verbose\""," or\n",[126,317,318],{},"\"numeric\""," for ",[126,321,322],{},"ATV0","), ",[126,325,326],{},"completionMode",[126,328,329],{},"solicitedPrefixes",[126,331,332],{},"rxPrepare",[126,334,335],{},"appendCr",[126,337,338],{},"terminators",[126,340,341],{},"idleMs",[122,343,344,347,348,350,351,354,355,357,358,361,362,129,365,129,368,129,371,129,374,377,378,380],{},[126,345,346],{},"\\r"," is appended unless the command already ends with CR\u002FLF or ",[126,349,335],{}," is\n",[126,352,353],{},"false",". Solicited prefixes are derived from the command (",[126,356,200],{}," → ",[126,359,360],{},"+CSQ:",",\nalso ",[126,363,364],{},"^",[126,366,367],{},"#",[126,369,370],{},"$",[126,372,373],{},"%",[126,375,376],{},"*"," vendor prefixes); pass ",[126,379,329],{}," when the\nreply uses a different one.",[146,382,384],{"id":383},"session-defaults","Session defaults",[152,386,388],{"className":154,"code":387,"language":156,"meta":157,"style":157},"await port.configureAtSession({\n  defaultTimeoutMs: 5000,\n  expectOk: true,      \u002F\u002F reject when status is not \"ok\"\n  stopOnError: true,   \u002F\u002F sendAtPhases: stop at the first failing phase\n  appendCr: true,\n  resultFormat: \"verbose\",\n});\n",[126,389,390,407,422,439,453,465,483],{"__ignoreMap":157},[161,391,392,395,397,399,402,404],{"class":163,"line":164},[161,393,394],{"class":179},"await",[161,396,183],{"class":171},[161,398,186],{"class":175},[161,400,401],{"class":189},"configureAtSession",[161,403,193],{"class":171},[161,405,406],{"class":175},"{\n",[161,408,409,413,416,420],{"class":163,"line":211},[161,410,412],{"class":411},"swJcz","  defaultTimeoutMs",[161,414,415],{"class":175},":",[161,417,419],{"class":418},"sbssI"," 5000",[161,421,237],{"class":175},[161,423,424,427,429,433,436],{"class":163,"line":218},[161,425,426],{"class":411},"  expectOk",[161,428,415],{"class":175},[161,430,432],{"class":431},"sfNiH"," true",[161,434,435],{"class":175},",",[161,437,438],{"class":214},"      \u002F\u002F reject when status is not \"ok\"\n",[161,440,441,444,446,448,450],{"class":163,"line":224},[161,442,443],{"class":411},"  stopOnError",[161,445,415],{"class":175},[161,447,432],{"class":431},[161,449,435],{"class":175},[161,451,452],{"class":214},"   \u002F\u002F sendAtPhases: stop at the first failing phase\n",[161,454,456,459,461,463],{"class":163,"line":455},5,[161,457,458],{"class":411},"  appendCr",[161,460,415],{"class":175},[161,462,432],{"class":431},[161,464,237],{"class":175},[161,466,468,471,473,476,479,481],{"class":163,"line":467},6,[161,469,470],{"class":411},"  resultFormat",[161,472,415],{"class":175},[161,474,475],{"class":175}," \"",[161,477,478],{"class":199},"verbose",[161,480,196],{"class":175},[161,482,237],{"class":175},[161,484,486,489,491],{"class":163,"line":485},7,[161,487,488],{"class":175},"}",[161,490,205],{"class":171},[161,492,208],{"class":175},[122,494,495,496,499,500,186],{},"Pass the same object as ",[126,497,498],{},"atSession"," to the constructor to apply it on every\n",[126,501,502],{},"open()",[122,504,505,506,509,510,513,514,517],{},"Before each command the queue soft-drains stale input (",[126,507,508],{},"rxPrepare: \"drain\"",", the\ndefault): bytes left from an earlier timed-out reply are discarded, URCs in them\nare still emitted. Use ",[126,511,512],{},"\"purge\""," to drop the OS buffers too, or ",[126,515,516],{},"\"none\""," to keep\neverything.",[146,519,521],{"id":520},"multi-phase-commands-and-sms","Multi-phase commands and SMS",[122,523,524,526,527,530],{},[126,525,135],{}," runs several writes as one queue job, so nothing else can slip\nin between (for example between ",[126,528,529],{},"AT+CMGS"," and the PDU):",[152,532,534],{"className":154,"code":533,"language":156,"meta":157,"style":157},"const results = await port.sendAtPhases([\n  { write: \"AT+CMGS=23\", completionMode: \"atIntermediate\" }, \u002F\u002F waits for \"> \"\n  { write: pduBytes \u002F* Uint8Array incl. Ctrl+Z *\u002F },\n]);\n",[126,535,536,557,594,611],{"__ignoreMap":157},[161,537,538,540,543,545,547,549,551,554],{"class":163,"line":164},[161,539,168],{"class":167},[161,541,542],{"class":171}," results ",[161,544,176],{"class":175},[161,546,180],{"class":179},[161,548,183],{"class":171},[161,550,186],{"class":175},[161,552,553],{"class":189},"sendAtPhases",[161,555,556],{"class":171},"([\n",[161,558,559,562,565,567,569,572,574,576,579,581,583,586,588,591],{"class":163,"line":211},[161,560,561],{"class":175},"  {",[161,563,564],{"class":411}," write",[161,566,415],{"class":175},[161,568,475],{"class":175},[161,570,571],{"class":199},"AT+CMGS=23",[161,573,196],{"class":175},[161,575,435],{"class":175},[161,577,578],{"class":411}," completionMode",[161,580,415],{"class":175},[161,582,475],{"class":175},[161,584,585],{"class":199},"atIntermediate",[161,587,196],{"class":175},[161,589,590],{"class":175}," },",[161,592,593],{"class":214}," \u002F\u002F waits for \"> \"\n",[161,595,596,598,600,602,605,608],{"class":163,"line":218},[161,597,561],{"class":175},[161,599,564],{"class":411},[161,601,415],{"class":175},[161,603,604],{"class":171}," pduBytes ",[161,606,607],{"class":214},"\u002F* Uint8Array incl. Ctrl+Z *\u002F",[161,609,610],{"class":175}," },\n",[161,612,613,616],{"class":163,"line":224},[161,614,615],{"class":171},"])",[161,617,208],{"class":175},[122,619,620,623,624,627,628,631,632,634,635,637,638,641],{},[126,621,622],{},"sendSmsPdu(length, pdu, { timeoutMs? })"," is the built-in version of exactly that:\nit waits for the ",[126,625,626],{},"> "," prompt, sends the PDU with Ctrl+Z and resolves on\n",[126,629,630],{},"+CMGS: n"," \u002F ",[126,633,233],{},". If the modem answers ",[126,636,529],{}," with ",[126,639,640],{},"+CMS ERROR",", it fails\nright away instead of waiting for the timeout.",[146,643,645,647],{"id":644},"exchange-for-non-at-protocols",[126,646,128],{}," for non-AT protocols",[122,649,650,631,653,656],{},[126,651,652],{},"exchange(text, options)",[126,654,655],{},"exchangeBinary(bytes, options)"," write and read until a\ncondition, through the same queue:",[658,659,660,674],"table",{},[661,662,663],"thead",{},[664,665,666,671],"tr",{},[667,668,669],"th",{},[126,670,326],{},[667,672,673],{},"Completes when",[675,676,677,689,706],"tbody",{},[664,678,679,686],{},[680,681,682,685],"td",{},[126,683,684],{},"\"atFinalLine\""," (default)",[680,687,688],{},"A final AT result line arrives",[664,690,691,696],{},[680,692,693],{},[126,694,695],{},"\"atIntermediate\"",[680,697,698,699,129,702,705],{},"A prompt (",[126,700,701],{},">",[126,703,704],{},"CONNECT",") or a final line arrives",[664,707,708,713],{},[680,709,710],{},[126,711,712],{},"\"substring\"",[680,714,715,716,718],{},"One of ",[126,717,338],{}," appears anywhere",[122,720,721,722,724,725,728,729,731,732,311,735,129,737,129,739,129,741,237,743,129,745,747],{},"Plus ",[126,723,341],{}," (done after this much silence), ",[126,726,727],{},"maxBytes"," and ",[126,730,307],{},".\nThe result is an ",[126,733,734],{},"ExchangeResponse",[126,736,298],{},[126,738,292],{},[126,740,280],{},[126,742,283],{},[126,744,286],{},[126,746,289],{},").",[146,749,751],{"id":750},"cancelling","Cancelling",[122,753,754,757,758,761,762,765,766,769,770,631,772,774],{},[126,755,756],{},"cancelExchange()"," (alias ",[126,759,760],{},"cancelAt()",") fails the running job with\n",[126,763,764],{},"exchange cancelled",", rejects every queued job with\n",[126,767,768],{},"transaction queue cancelled",", and leaves the queue ready for the next call. A\ncancel that lands between the phases of ",[126,771,135],{},[126,773,139],{}," stops\nthe remaining phases.",[146,776,778],{"id":777},"urcs-while-commands-run","URCs while commands run",[122,780,781,782,785],{},"Keep a watch with ",[126,783,784],{},"onUrc"," to get unsolicited lines live, including the ones\nthat arrive while a command is in flight:",[152,787,789],{"className":154,"code":788,"language":156,"meta":157,"style":157},"await port.watch({\n  onData: () => {},\n  onUrc: (line) => console.log(\"URC\", line), \u002F\u002F +CMTI: \"SM\",3 \u002F RING \u002F +CREG: 1\n});\nawait port.sendAt(\"AT+CSQ\"); \u002F\u002F the watch keeps running\n",[126,790,791,806,822,865,873],{"__ignoreMap":157},[161,792,793,795,797,799,802,804],{"class":163,"line":164},[161,794,394],{"class":179},[161,796,183],{"class":171},[161,798,186],{"class":175},[161,800,801],{"class":189},"watch",[161,803,193],{"class":171},[161,805,406],{"class":175},[161,807,808,811,813,816,819],{"class":163,"line":211},[161,809,810],{"class":189},"  onData",[161,812,415],{"class":175},[161,814,815],{"class":175}," ()",[161,817,818],{"class":167}," =>",[161,820,821],{"class":175}," {},\n",[161,823,824,827,829,831,834,836,838,841,843,846,848,850,853,855,857,860,862],{"class":163,"line":218},[161,825,826],{"class":189},"  onUrc",[161,828,415],{"class":175},[161,830,311],{"class":175},[161,832,163],{"class":833},"sHdIc",[161,835,205],{"class":175},[161,837,818],{"class":167},[161,839,840],{"class":171}," console",[161,842,186],{"class":175},[161,844,845],{"class":189},"log",[161,847,193],{"class":171},[161,849,196],{"class":175},[161,851,852],{"class":199},"URC",[161,854,196],{"class":175},[161,856,435],{"class":175},[161,858,859],{"class":171}," line)",[161,861,435],{"class":175},[161,863,864],{"class":214}," \u002F\u002F +CMTI: \"SM\",3 \u002F RING \u002F +CREG: 1\n",[161,866,867,869,871],{"class":163,"line":224},[161,868,488],{"class":175},[161,870,205],{"class":171},[161,872,208],{"class":175},[161,874,875,877,879,881,883,885,887,889,891,893,896],{"class":163,"line":455},[161,876,394],{"class":179},[161,878,183],{"class":171},[161,880,186],{"class":175},[161,882,190],{"class":189},[161,884,193],{"class":171},[161,886,196],{"class":175},[161,888,200],{"class":199},[161,890,196],{"class":175},[161,892,205],{"class":171},[161,894,895],{"class":175},";",[161,897,898],{"class":214}," \u002F\u002F the watch keeps running\n",[146,900,902],{"id":901},"cmux-gsm-0710-3gpp-27010","CMUX (GSM 07.10 \u002F 3GPP 27.010)",[122,904,905,906,909],{},"CMUX splits one modem port into several logical channels (for example AT\ncommands on one, PPP data on another). The plugin speaks the basic option of\n27.010: ",[126,907,908],{},"AT+CMUX=0",", SABM\u002FUA per channel, CLD on teardown.",[152,911,913],{"className":154,"code":912,"language":156,"meta":157,"style":157},"await port.enableMux();                       \u002F\u002F sends AT+CMUX=0,0,5,31,10,2 and opens DLCI 0\nconst at = await port.openMuxChannel(1);      \u002F\u002F a SerialPort for DLCI 1 (1..=63)\nconst data = await port.openMuxChannel(2);\nawait at.sendAt(\"ATI\");\nawait port.disableMux();                      \u002F\u002F CLD: the modem returns to AT mode\n",[126,914,915,934,964,990,1014],{"__ignoreMap":157},[161,916,917,919,921,923,926,929,931],{"class":163,"line":164},[161,918,394],{"class":179},[161,920,183],{"class":171},[161,922,186],{"class":175},[161,924,925],{"class":189},"enableMux",[161,927,928],{"class":171},"()",[161,930,895],{"class":175},[161,932,933],{"class":214},"                       \u002F\u002F sends AT+CMUX=0,0,5,31,10,2 and opens DLCI 0\n",[161,935,936,938,941,943,945,947,949,952,954,957,959,961],{"class":163,"line":211},[161,937,168],{"class":167},[161,939,940],{"class":171}," at ",[161,942,176],{"class":175},[161,944,180],{"class":179},[161,946,183],{"class":171},[161,948,186],{"class":175},[161,950,951],{"class":189},"openMuxChannel",[161,953,193],{"class":171},[161,955,956],{"class":418},"1",[161,958,205],{"class":171},[161,960,895],{"class":175},[161,962,963],{"class":214},"      \u002F\u002F a SerialPort for DLCI 1 (1..=63)\n",[161,965,966,968,971,973,975,977,979,981,983,986,988],{"class":163,"line":218},[161,967,168],{"class":167},[161,969,970],{"class":171}," data ",[161,972,176],{"class":175},[161,974,180],{"class":179},[161,976,183],{"class":171},[161,978,186],{"class":175},[161,980,951],{"class":189},[161,982,193],{"class":171},[161,984,985],{"class":418},"2",[161,987,205],{"class":171},[161,989,208],{"class":175},[161,991,992,994,997,999,1001,1003,1005,1008,1010,1012],{"class":163,"line":224},[161,993,394],{"class":179},[161,995,996],{"class":171}," at",[161,998,186],{"class":175},[161,1000,190],{"class":189},[161,1002,193],{"class":171},[161,1004,196],{"class":175},[161,1006,1007],{"class":199},"ATI",[161,1009,196],{"class":175},[161,1011,205],{"class":171},[161,1013,208],{"class":175},[161,1015,1016,1018,1020,1022,1025,1027,1029],{"class":163,"line":455},[161,1017,394],{"class":179},[161,1019,183],{"class":171},[161,1021,186],{"class":175},[161,1023,1024],{"class":189},"disableMux",[161,1026,928],{"class":171},[161,1028,895],{"class":175},[161,1030,1031],{"class":214},"                      \u002F\u002F CLD: the modem returns to AT mode\n",[1033,1034,1035,1045,1062,1065,1068,1071,1091,1104,1113,1116,1124],"ul",{},[1036,1037,1038,1041,1042,1044],"li",{},[126,1039,1040],{},"enableMux({ command?, timeoutMs? })"," fails if the modem answers ",[126,1043,236],{}," or does\nnot acknowledge the control channel.",[1036,1046,1047,1048,1051,1052,237,1054,129,1057,728,1060,186],{},"Virtual channels are paths like ",[126,1049,1050],{},"\u002Fdev\u002FttyUSB0#dlci=2"," and support ",[126,1053,190],{},[126,1055,1056],{},"exchange",[126,1058,1059],{},"write",[126,1061,801],{},[1036,1063,1064],{},"Closing the physical port closes its channels and sends CLD.",[1036,1066,1067],{},"Frames carry at most 31 bytes (the 27.010 default N1); larger writes are split.",[1036,1069,1070],{},"After each channel's UA the plugin sends MSC (RTC, RTR, DV set) on DLCI 0. The\nmodem's own control commands (PN, PSC, TEST, MSC, RPN, RLS, FCon, FCoff, CLD) are\nanswered by echoing them; any other command gets NSC (27.010 §5.4.6.3.8).",[1036,1072,1073,1074,1077,1078,1081,1082,1084,1085,1088,1089,186],{},"Opening a channel: when the ",[126,1075,1076],{},"AT+CMUX"," command gives T1 or N2 (5th and 6th\nparameters, T1 in 10 ms units; defaults 100 ms and 3), SABM is resent every T1, at\nmost N2 times, and the whole wait is ",[126,1079,1080],{},"max(timeout, T1 × (N2 + 1))",", the last try\ngetting what is left. Without them one SABM is sent and its UA gets the whole\ntimeout, as in 4.x. (The default ",[126,1083,925],{}," command gives T1 = 10, N2 = 2.) The\ntimeout is ",[126,1086,1087],{},"max(timeoutMs, 500 ms)"," for the control channel (DLCI 0) and a fixed\n3 s for ",[126,1090,951],{},[1036,1092,1093,1094,1096,1097,1100,1101,1103],{},"If the modem closes a channel (DISC, answered with UA, or DM), its ",[126,1095,801],{}," gets\n",[126,1098,1099],{},"disconnect"," with the channel path and writes on it fail; the other channels stay\nopen. Re-open it with ",[126,1102,951],{}," (old watches on it are dropped; start a new\none).",[1036,1105,1106,1107,1109,1110,1112],{},"If the modem leaves multiplexer mode (DISC or DM on DLCI 0, or CLD from the modem),\nevery channel watch gets ",[126,1108,1099],{},", channel writes fail, and the physical port is\na plain port again (",[126,1111,925],{}," works again).",[1036,1114,1115],{},"Flow control: while the modem holds FCoff (every channel) or an MSC with FC set\n(that channel), a channel write waits; when it ends the write goes out, after the\nwrite timeout (below) the write fails with \"CMUX flow control off\" and is not sent\nlater. A write waiting for a channel that is closed meanwhile fails at once.",[1036,1117,1118,1120,1121,1123],{},[126,1119,1024],{}," waits up to T2 (7th ",[126,1122,1076],{}," parameter, default 300 ms) for the\nCLD response, without blocking calls on other ports.",[1036,1125,1126],{},"A channel write gets a timeout from its wire time at the port's baud rate, as\nplain-port writes do.",[122,1128,1129],{},"Tested against a Quectel M26.",[1131,1132,1133],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":157,"searchDepth":211,"depth":218,"links":1135},[1136,1137,1138,1139,1141,1142,1143],{"id":148,"depth":211,"text":132},{"id":383,"depth":211,"text":384},{"id":520,"depth":211,"text":521},{"id":644,"depth":211,"text":1140},"exchange() for non-AT protocols",{"id":750,"depth":211,"text":751},{"id":777,"depth":211,"text":778},{"id":901,"depth":211,"text":902},"Modem queue, SMS, URCs and multiplexing.","md",null,{},true,{"title":38,"description":1144},"EbFic0kcBqMcC7-HU5inePH1I-qRnkScWvswIUE6gTI",[1152,1154],{"title":34,"path":35,"stem":36,"description":1153,"children":-1},"Every method, option, event and error of tauri-plugin-serialplugin-api.",{"title":42,"path":43,"stem":44,"description":1155,"children":-1},"Using the plugin from your Tauri backend.",1794158000995]