{"id":2310,"date":"2025-04-15T09:54:40","date_gmt":"2025-04-15T09:54:40","guid":{"rendered":"https:\/\/webprojects.cloud\/wordpress\/splatco\/?post_type=spl_knowledgebase&#038;p=2310"},"modified":"2025-06-11T06:03:58","modified_gmt":"2025-06-11T06:03:58","slug":"acomrx_strfind-ppc-d28","status":"publish","type":"spl_knowledgebase","link":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/","title":{"rendered":"aComRx_StrFind pp,c [D>=28]"},"content":{"rendered":"\n<p>Match a received string to a table in&nbsp;<a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/glossary-of-terms\/#o2970\">NVEM<\/a>.&nbsp;<em>This is subtly different to&nbsp;<\/em><code><a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind2-ppc-d29\/\">aComRx_StrFind2<\/a><\/code><em>, which uses a different table format<\/em>. The &#8216;a&#8217; first letter of the keyword indicates that this is the &#8220;addressable&#8221; version, meaning the instruction can address a serial port other than the default.<\/p>\n\n\n\n<p>This instruction seeks to match the data at the head of the<strong>&nbsp;serial Rx buffer for port pp&nbsp;<\/strong>with one or more &#8220;canned&#8221; strings stored in NVEM. Its primary use is for detecting received commands and machine generated ASCII messages. For example, we initially created it to assist in interacting with a cellular modem, for sending and receiving SMS messages.<\/p>\n\n\n\n<p>If argument c is zero, the instruction treats upper and lower case letters as equivalent. If c is non-zero, the case of the received string must match exactly the string stored in NVEM.<\/p>\n\n\n\n<p>The data in NVEM must be stored in a very specific &#8220;NULL terminated&#8221; format. This is best illustrated by an example. Lets say we want to detect which fruit has been requested, typed in on a terminal emulator and ending in a carriage return (&#8216;0D or 13)<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">1. NVEM: Message list<\/h6>\n\n\n\n<p>First you construct a list of all possible receive strings in&nbsp;<a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/non-volatile-extended-memory-nvem-users-guide\/\">NVEM<\/a>. Each string must be terminated with a 0 byte. The 0 is not part of the string, it merely signals the end of the string (C-style NULL terminated strings).<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">strOrange:      NV0Byte   \"Orange\",13,0\nstrApple:       NV0Byte   \"Apple\",13,0\nstrBanana:      NV0Byte   \"Banana\",13,0\nstrLemon:       NV0Byte   \"Lemon\",13,0\nstrPear:        NV0Byte   \"Pear\",13,0\nstrGrape:       NV0Byte   \"Grape\",13,0\n;        Terminator _________________^<\/pre>\n\n\n\n<h6 class=\"wp-block-heading\">2. NVEM: Pointer table<\/h6>\n\n\n\n<p>Next you construct a table, in NVEM, of pointers to the individual strings. This must be terminated in two 255 bytes. The 255s tell aCom<code>Rx_StrFind<\/code>&nbsp;that it has come to the end of the table.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">FruitNames:     NV0Ptr    strOrange\t;Entry #1\n                NV0Ptr    strLemon \t;Entry #2\n                NV0Ptr    strApple \t;Entry #3\n                NV0Ptr    strPear  \t;Entry #4\n                NV0Ptr    strBanana\t;Entry #5\n                NV0Ptr    strGrape \t;Entry #6\n                NV0Byte   255,255      ;&lt;&lt;&lt;&lt;&lt; Essential!!!<\/pre>\n\n\n\n<p>You will notice that the order of entries is different to the order of the strings themselves. They can be in any order you like, and you can have several such tables, with different ordering, even different sets of strings.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">3. Code: Wait for a message string<\/h6>\n\n\n\n<p>Now to your actual code (the above is tables, not executable code). The first thing your code needs to do is wait until it knows there&#8217;s a string the the Rx buffer, ready to be interpreted. In this case we know that a carriage return signals the end of an incoming string in the Rx buffer. Hence, we might wait until there is a carriage return present. Let&#8217;s say this is a MultiTrack task, so we simply write a loop that waits for the carriage return, thus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">COM1            EQU               252        ;Address of the required serial port                <br>CRWait:         <a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/multitrack-instructions\/yieldtask-d16\/\">YieldTask<\/a><br>                LoadX             13         ;Carriage return <br>                aComRx_FindXInBuf COM1       ;Is there a CR in the Rx buffer?<br>                <a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/number-comparison-and-testing-instructions\/comparison-and-testing-for-byte-values\/goifxeq-nnllll\/\">GoIfXEQ<\/a>           255,CRWait ;loop back if not<\/pre>\n\n\n\n<p>This code snippet will sit and loop until a CR appears. Then it will &#8220;fall through&#8221;. Once it falls through we now for sure that there is a message waiting for us (barring something going wrong!).<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">4. Code: Find a string match.<\/h6>\n\n\n\n<p>This is where we use the actual&nbsp;<code>ComRx_StrFind<\/code>&nbsp;instruction. First we have to make sure the NVEM access is correctly set up.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">                <a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/non-volatile-memory\/nvsetptr-pppp-d15\/\">NVSetPtr<\/a>          FruitNames<br>                NVSetPage         0           ;0 is the default, so playing very safe!<br>                aComRx_StrFind    COM1,0      ;Seek a match between Rx buffer and the tabulated strings<\/pre>\n\n\n\n<h6 class=\"wp-block-heading\">5. Code: Evaluate the result.<\/h6>\n\n\n\n<p>The\u00a0<code>ComRx_StrFind<\/code>\u00a0returns its result in\u00a0<a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/glossary-of-terms\/#o3808\">X<\/a>, as follows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If a match is found, the X-register contains the number of the entry in the pointer table,&nbsp;<em>counting from 1<\/em>. Thus, if in this case the received string was&nbsp;<code>\"Apple\",13<\/code>, X would contain 3.<\/li>\n\n\n\n<li>If a match is not found, X will contain 0 (which makes&nbsp;<code>Branch<\/code>&nbsp;instruction very appropriate).<\/li>\n<\/ul>\n\n\n\n<p>If a match is found, the matching string is removed from the Rx buffer. If no match is found the Rx buffer is not changed.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">                <a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/number-comparison-and-testing-instructions\/comparison-and-testing-for-byte-values\/branch\/\">Branch<\/a><br>                Target     NoMatch<br>                Target     RxOrange<br>                Target     RxLemon<br>                Target     RxApple<br>                Target     RxPear<br>                Target     RxBanana<br>                Target     RxGrape<br><br>RxOrange:   ;Do the orange thing ....<br>RxLemon:    ;Do the lemon thing ....<br>RxApple:    ;Do the apple thing ....<br>RxPear:     ;Do the pear thing ....<br>RxBanana:   ;Do the banana thing ....<br>RxGrape:    ;Do the grape thing ....<\/pre>\n\n\n\n<p>You would place your own code to respond to each of the strings at&nbsp;<code>RxOrange<\/code>,&nbsp;<code>RxLemon<\/code>, etc. Quite likely you would then go back to&nbsp;<code>CRWait<\/code>&nbsp;and wait for the next incoming message.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">6. Flush any garbage.<\/h6>\n\n\n\n<p>This step is what may make the difference between something that works perfectly in the lab but falters in the field. It handles the case of a message being received garbled. Serial communications is not a perfect medium &#8230; things can and do go wrong over any communications medium. Even if you believe you have a perfect transmission channel, something as simple as a cable being plugged halfway through a message will corrupt it. An electrical noise spike can corrupt a character. If your program can get hung up because it can&#8217;t detect a partial message, it will have to be restarted.<\/p>\n\n\n\n<p>The strategy to overcome this risk is that whenever there should be a valid message in the Rx buffer (in our case when there&#8217;s a carriage return character), but&nbsp;<code>ComRx_StrFind<\/code>&nbsp;is unable to decide what it is, we discard one single character from the head of the buffer. Remember,&nbsp;<code>ComRx_StrFind<\/code>&nbsp;will only detect a message that starts at the head of the buffer. One single stray character at the very start will &#8220;blind&#8221; it. So we &#8220;shave&#8221; character off the head until we either expose a valid message or we have emptied the buffer. This strategy will ensure that any corrupted messages get discarded. Other strategies are possible, depending on what is known about a given application.<\/p>\n\n\n\n<p>In the above code the&nbsp;<code>Branch<\/code>&nbsp;target for no message is&nbsp;<code>NoMatch<\/code>. So &#8230;.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">NoMatch:        aComRx_ReadOne\t COM1\t      ;Shave one character off the head\n                GoTo              CRWait     ;Go back and try again <\/pre>\n\n\n\n<h6 class=\"wp-block-heading\">Putting it all together<\/h6>\n\n\n\n<p>To make it easier to understand, the description above started with the NVEM tables and ended with the executable code. In a real program all NVEM data must come last, and be preceded by a&nbsp;<code><a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/non-volatile-memory\/nvem0-directive-d15\/\">NVEM0<\/a><\/code>&nbsp;directive. If this is all new to you, please see&nbsp;<a href=\"https:\/\/www.splatco.com\/skb\/2437.htm\">NVEM <\/a><a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/tutorials-application-notes-and-white-papers\/non-volatile-extended-memory-nvem-users-guide\/\">Documentation<\/a>. Here it all is, in the correct order (this is still just a skeleton, as you must make sure it gets invoked in the manner best suited to your program, and you must of course add the actions required for each detected type of fruit):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">;Wait for a carriage return character to appear in the Rx buffer<br>COM1            EQU               252        ;Address of the required serial port                <br>CRWait:         <a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/multitrack-instructions\/yieldtask-d16\/\">YieldTask<\/a><br>                LoadX             13         ;Carriage Return <br>                aComRx_FindXInBuf COM1       ;Is there a CR in the Rx buffer?<br>                <a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/number-comparison-and-testing-instructions\/comparison-and-testing-for-byte-values\/goifxeq-nnllll\/\">GoIfXEQ<\/a>           255,CRWait ;loop back if not<br><br>;There's a CR in the buffer, hence a full message. Find a string match.<br>                NVSetPtr          FruitNames<br>                NVSetPage         0          ;0 is the default, so playing very safe!<br>                aComRx_StrFind    COM1,0     ;Seek a case insensitive match between Rx buffer and the tabulated strings<br>;Evaluate the result.<br>                Branch<br>                Target     NoMatch<br>                Target     RxOrange<br>                Target     RxLemon<br>                Target     RxApple<br>                Target     RxPear<br>                Target     RxBanana<br>                Target     RxGrape<br>;Actions<br>RxOrange:   ;Do the orange thing ....<br>RxLemon:    ;Do the lemon thing ....<br>RxApple:    ;Do the apple thing ....<br>RxPear:     ;Do the pear thing ....<br>RxBanana:   ;Do the banana thing ....<br>RxGrape:    ;Do the grape thing ....<br><br>;Flush any garbage.<br>NoMatch:        aComRx_ReadOne\tCOM1\t ;Shave one character off the head<br>                GoTo             CRWait ;Go back and try again <br>;===================================================================<br>                NVEM0        ;Start of NonVolatile MEMory region 0<br>;Messages\/strings<br>strOrange:      NV0Byte   \"Orange\",13,0<br>strApple:       NV0Byte   \"Apple\",13,0<br>strBanana:      NV0Byte   \"Banana\",13,0<br>strLemon:       NV0Byte   \"Lemon\",13,0<br>strPear:        NV0Byte   \"Pear\",13,0<br>strGrape:       NV0Byte   \"Grape\",13,0<br><br>;Table of pointers<br>FruitNames:     NV0Ptr    strOrange\t;Entry #1<br>                NV0Ptr    strLemon \t;Entry #2<br>                NV0Ptr    strApple \t;Entry #3<br>                NV0Ptr    strPear  \t;Entry #4<br>                NV0Ptr    strBanana\t;Entry #5<br>                NV0Ptr    strGrape \t;Entry #6<br>                NV0Byte   255,255      ;&lt;&lt;&lt;&lt;&lt; Essential!!!<\/pre>\n\n\n\n<h6 class=\"wp-block-heading\">Notes\/reminders:<\/h6>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The instruction only removes from the buffer the characters of any string it matches.<\/li>\n\n\n\n<li>The string must be at the very head of the buffer.<\/li>\n\n\n\n<li>The instruction argument controls case sensitivity<\/li>\n\n\n\n<li>Each string in NVEM must end in a 0 (NULL) byte.<\/li>\n\n\n\n<li>The table of pointers must end in two 255 bytes.<\/li>\n\n\n\n<li>The record length and record number pointers are not involved in this instruction. Only the page and pointer matter.<\/li>\n<\/ol>\n\n\n\n<p><a href=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/glossary-of-terms\/#o2825\">Dialect<\/a>&nbsp;exclusions: Not available in dialects before 28<\/p>\n\n\n\n<p>Can only exist on boards that have an uncommitted serial port other than the programming port.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Match a received string to a table in&nbsp;NVEM.&nbsp;This is subtly different to&nbsp;aComRx_StrFind2, which uses a different table format. The &#8216;a&#8217; first letter of the keyword&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":2300,"menu_order":8,"template":"","class_list":["post-2310","spl_knowledgebase","type-spl_knowledgebase","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>aComRx_StrFind pp,c [D&gt;=28] - SPLat Controls<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"aComRx_StrFind pp,c [D&gt;=28] - SPLat Controls\" \/>\n<meta property=\"og:description\" content=\"Match a received string to a table in&nbsp;NVEM.&nbsp;This is subtly different to&nbsp;aComRx_StrFind2, which uses a different table format. The &#8216;a&#8217; first letter of the keyword...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/\" \/>\n<meta property=\"og:site_name\" content=\"SPLat Controls\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-11T06:03:58+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/\",\"name\":\"aComRx_StrFind pp,c [D>=28] - SPLat Controls\",\"isPartOf\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website\"},\"datePublished\":\"2025-04-15T09:54:40+00:00\",\"dateModified\":\"2025-06-11T06:03:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming reference\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Instructions arranged by function\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Communications instructions\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"Any Serial Port\",\"item\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/\"},{\"@type\":\"ListItem\",\"position\":6,\"name\":\"aComRx_StrFind pp,c [D>=28]\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\",\"name\":\"SPLat Controls\",\"description\":\"OEM Embedded Machine Controllers\",\"publisher\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization\",\"name\":\"SPLat Controls\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg\",\"contentUrl\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg\",\"caption\":\"SPLat Controls\"},\"image\":{\"@id\":\"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"aComRx_StrFind pp,c [D>=28] - SPLat Controls","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"aComRx_StrFind pp,c [D>=28] - SPLat Controls","og_description":"Match a received string to a table in&nbsp;NVEM.&nbsp;This is subtly different to&nbsp;aComRx_StrFind2, which uses a different table format. The &#8216;a&#8217; first letter of the keyword...","og_url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/","og_site_name":"SPLat Controls","article_modified_time":"2025-06-11T06:03:58+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/","name":"aComRx_StrFind pp,c [D>=28] - SPLat Controls","isPartOf":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website"},"datePublished":"2025-04-15T09:54:40+00:00","dateModified":"2025-06-11T06:03:58+00:00","breadcrumb":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/acomrx_strfind-ppc-d28\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/"},{"@type":"ListItem","position":2,"name":"Programming reference","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/"},{"@type":"ListItem","position":3,"name":"Instructions arranged by function","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/"},{"@type":"ListItem","position":4,"name":"Communications instructions","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/"},{"@type":"ListItem","position":5,"name":"Any Serial Port","item":"https:\/\/webprojects.cloud\/wordpress\/splatco\/knowledgebase\/programming-reference\/instructions-arranged-by-function\/communications-instructions\/any-serial-port\/"},{"@type":"ListItem","position":6,"name":"aComRx_StrFind pp,c [D>=28]"}]},{"@type":"WebSite","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#website","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/","name":"SPLat Controls","description":"OEM Embedded Machine Controllers","publisher":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webprojects.cloud\/wordpress\/splatco\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#organization","name":"SPLat Controls","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/","url":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg","contentUrl":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-content\/uploads\/2024\/10\/logo.svg","caption":"SPLat Controls"},"image":{"@id":"https:\/\/webprojects.cloud\/wordpress\/splatco\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase\/2310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase"}],"about":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/types\/spl_knowledgebase"}],"author":[{"embeddable":true,"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/users\/1"}],"up":[{"embeddable":true,"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/spl_knowledgebase\/2300"}],"wp:attachment":[{"href":"https:\/\/webprojects.cloud\/wordpress\/splatco\/wp-json\/wp\/v2\/media?parent=2310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}